El problema
Tengo un par de consultas que, bajo aislamiento serializable, provocan un bloqueo RX-X. Sin embargo, cuando uso Extended Events para ver la adquisición del bloqueo, la adquisición del bloqueo RX-X nunca aparece, solo se libera. ¿De dónde viene?
El Repro
Aquí está mi mesa:
CREATE TABLE dbo.LockTest (
ID int identity,
Junk char(4)
)
CREATE CLUSTERED INDEX CX_LockTest --not unique!
ON dbo.LockTest(ID)
--preload some rows
INSERT dbo.LockTest
VALUES ('data'),('data'),('data')
Aquí está mi lote de problemas:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT dbo.LockTest
VALUES ('bleh')
SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()
--ROLLBACK
Verifico las cerraduras en esta sesión y veo RX-X:
SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!
Pero también tengo un evento extendido en lock_acquired
y lock_released
. Lo filtro en el objeto_id_objetivo asociado apropiado ... no hay RX-X.
Después de ejecutar la reversión, veo RX-X (LAST_MODE) lanzado, a pesar de que nunca fue adquirido.
Lo que he probado
Miré todas las cerraduras en Eventos extendidos, sin filtrado. No se adquirieron bloqueos RX-X.
También probé Profiler: los mismos resultados (excepto que, por supuesto, tiene el nombre correcto ... no "LAST_MODE").
Ejecuté el XE para escaladas de bloqueo, no está allí.
No hay XE específicamente para las conversiones, pero pude confirmar que al menos la conversión de bloqueo U a X es capturada por
lock_acquired
También es notable el RI-N que se adquiere pero nunca se lanza. Mi hipótesis actual es que el RX-X es un bloqueo de conversión, como se describe aquí . Hay bloqueos de rango de teclas superpuestos en mi lote que parecen calificar para la conversión, pero el bloqueo RX-X no está en la tabla de conversión.
¿De dónde viene esta cerradura y por qué Extended Events no la activa?
fuente