Проблема
У мене є пара запитів, які під час серіалізаційної ізоляції викликають блокування RX-X. Однак, коли я використовую розширені події для перегляду придбання блокування, придбання блокування RX-X ніколи не з'являється, воно лише випускається. Звідки воно походить?
Репро
Ось мій стіл:
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')
Ось мій пакет проблем:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT dbo.LockTest
VALUES ('bleh')
SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()
--ROLLBACK
Я перевіряю блокування, проведені цим сеансом, і бачу RX-X:
SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!
Але я також маю розширений захід на lock_acquired
та lock_released
. Я фільтрую його за відповідним асоційованим_об'єктом_id ... RX-X немає.
Після виконання відкату я бачу, що RX-X (LAST_MODE) звільнений, хоча він ніколи не був придбаний.
Що я пробував
Я переглянув усі замки в розширених подіях - відсутня фільтрація. Не придбано замок RX-X.
Я також спробував Profiler: ті ж результати (за винятком, звичайно, він отримує назву правильно ... немає "LAST_MODE").
Я запустив XE для ескалації блокування - його там немає.
Спеціально для конверсій XE немає, але я зміг підтвердити, що принаймні перетворення блокування U - X фіксує
lock_acquired
Також слід зазначити, що RI-N отримує, але ніколи не випускається. Моя поточна гіпотеза полягає в тому, що RX-X є блоком перетворення, як описано тут . У моїй партії є блоки, що перекриваються між собою, які виглядають так, що вони мають право на конверсію, але замок RX-X відсутній у таблиці перетворення.
Звідки береться цей замок і чому його не підхоплюють розширені події?