Sorun
Ben serileştirilebilir izolasyon altında bir RX-X kilit neden sorguları bir çift var. Ancak, kilit alımını izlemek için Genişletilmiş Olaylar'ı kullandığımda, RX-X kilit alımı hiçbir zaman görünmez, yalnızca serbest bırakılır. Nereden geliyor?
Repro
İşte masam:
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')
İşte benim sorun toplu iş:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT dbo.LockTest
VALUES ('bleh')
SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()
--ROLLBACK
Bu oturum tarafından tutulan kilitleri kontrol ediyorum ve RX-X'i görüyorum:
SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!
Ama lock_acquired
ve üzerinde Genişletilmiş bir Etkinlik var lock_released
. Ben ilgili related_object_id filtre ... Ben RX-X yoktur.
Geri alma işlemini gerçekleştirdikten sonra, RX-X'in (LAST_MODE) hiçbir zaman edinilmemiş olmasına rağmen yayınlandığını görüyorum.
Ne Denedim
Genişletilmiş Etkinliklerde tüm kilitlere baktım - filtreleme yok. Hiçbir RX-X kilidi alınmadı.
Ben de Profiler denedim: aynı sonuçlar (tabii ki adı doğru alır ... hayır "LAST_MODE").
Kilit yükselmeleri için XE'yi çalıştırdım - orada değil.
Dönüşümler için özel olarak XE yoktur, ancak en azından U'dan X'e kilit dönüşümünün
lock_acquired
Ayrıca, edinilen ancak asla serbest bırakılmayan RI-N de dikkat çekicidir. Şu anki hipotezim, RX-X'in burada açıklandığı gibi bir dönüşüm kilidi olduğudur . Toplu işimde dönüşüm için uygun olmaları gerektiği gibi çakışan anahtar aralığı kilitleri var, ancak RX-X kilidi dönüşüm tablosunda değil.
Bu kilit nereden geliyor ve neden Genişletilmiş Etkinlikler tarafından alınmıyor?