Problem
Mam parę zapytań, które przy szeregowej izolacji powodują blokadę RX-X. Jednak gdy używam zdarzeń rozszerzonych do oglądania akwizycji blokady, akwizycja blokady RX-X nigdy się nie pojawia, jest ona tylko zwolniona. Skąd to pochodzi?
Repro
Oto mój stół:
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')
Oto moja partia problemów:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT dbo.LockTest
VALUES ('bleh')
SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()
--ROLLBACK
Sprawdzam blokady utrzymywane przez tę sesję i widzę RX-X:
SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!
Ale mam również Wydarzenie rozszerzone na lock_acquired
i lock_released
. Filtruję to na odpowiednim ID_obiektu_obowiązanego ... nie ma RX-X.
Po wykonaniu wycofania widzę zwolnienie RX-X (LAST_MODE), mimo że nigdy nie zostało nabyte.
Co próbowałem
Patrzyłem na wszystkie blokady w rozszerzonych zdarzeniach - bez filtrowania. Brak nabytych zamków RX-X.
Próbowałem także Profiler: te same wyniki (z wyjątkiem tego, że ma właściwą nazwę ... nie ma „LAST_MODE”).
Uruchomiłem XE dla eskalacji blokady - nie ma jej tam.
Nie ma XE specjalnie dla konwersji, ale byłem w stanie potwierdzić, że przechwytywana jest przynajmniej konwersja blokady U na X
lock_acquired
Na uwagę zasługuje również RI-N, który zostaje nabyty, ale nigdy nie wydany. Moja obecna hipoteza jest taka, że RX-X jest blokadą konwersji, jak opisano tutaj . W mojej partii występują nakładające się zamki z kluczem, które wyglądają, jakby kwalifikowały się do konwersji, ale zamka RX-X nie ma w tabeli konwersji.
Skąd pochodzi ta blokada i dlaczego nie jest odbierana przez Wydarzenie rozszerzone?
źródło