Masalah
Saya memiliki sepasang pertanyaan yang, di bawah isolasi serializable, menyebabkan kunci RX-X. Namun, ketika saya menggunakan Extended Events untuk menonton akuisisi kunci, akuisisi kunci RX-X tidak pernah muncul, itu hanya dirilis. Dari mana asalnya?
Repro
Ini meja saya:
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')
Inilah kumpulan masalah saya:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT dbo.LockTest
VALUES ('bleh')
SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()
--ROLLBACK
Saya memeriksa kunci yang dipegang oleh sesi ini, dan melihat RX-X:
SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!
Tapi saya juga punya acara diperpanjang pada lock_acquired
dan lock_released
. Saya memfilternya pada associ_object_id yang sesuai ... tidak ada RX-X.
Setelah menjalankan rollback, saya melihat RX-X (LAST_MODE) dirilis, meskipun tidak pernah diperoleh.
Apa yang saya coba
Saya melihat semua kunci di Extended Events - tanpa filter. Tidak ada kunci RX-X yang diperoleh.
Saya juga mencoba Profiler: hasil yang sama (kecuali tentu saja namanya tepat ... tidak ada "LAST_MODE").
Saya menjalankan XE untuk eskalasi kunci - tidak ada di sana.
Tidak ada XE khusus untuk konversi, tetapi saya dapat mengonfirmasi bahwa setidaknya konversi kunci U ke X ditangkap oleh
lock_acquired
Yang juga perlu diperhatikan adalah RI-N yang didapat tetapi tidak pernah dirilis. Hipotesis saya saat ini adalah bahwa RX-X adalah kunci konversi, seperti dijelaskan di sini . Ada kunci rentang kunci yang tumpang tindih dalam kumpulan saya yang sepertinya harus memenuhi syarat untuk konversi, tetapi kunci RX-X tidak ada dalam tabel konversi.
Dari mana kunci ini berasal, dan mengapa tidak diambil oleh Extended Events?