Проблема
У меня есть пара запросов, которые при сериализуемой изоляции вызывают блокировку 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
. Я отфильтрую его по соответствующему ассоциированному_объекту ... там нет RX-X.
После выполнения отката я вижу, что RX-X (LAST_MODE) выпущен, хотя он никогда не был получен.
Что я пробовал
Я посмотрел на все блокировки в расширенных событиях - без фильтрации. Замки RX-X не получены.
Я также попробовал Profiler: те же результаты (за исключением, конечно, он получает правильное имя ... нет "LAST_MODE").
Я запустил XE для повышения блокировки - его там нет.
Там нет XE специально для преобразований, но я смог подтвердить, что по крайней мере преобразование блокировки U в X захватывается
lock_acquired
Также следует отметить, что RI-N приобретается, но не выпускается. Моя текущая гипотеза состоит в том, что RX-X является блокировкой преобразования, как описано здесь . В моем пакете есть перекрывающиеся блокировки диапазона ключей, которые выглядят так, как будто они должны подходить для преобразования, но блокировки RX-X нет в таблице преобразования.
Откуда берется эта блокировка и почему она не обнаруживается расширенными событиями?