ปัญหา
ฉันมีคู่ของคำสั่งที่ทำให้เกิดการล็อค RX-X อย่างไรก็ตามเมื่อฉันใช้ Extended Events เพื่อดูการได้มาของการล็อคการได้รับ RX-X lock ไม่เคยปรากฏขึ้นมันจะออกมาเท่านั้น มันมาจากไหน?
Repro
นี่คือตารางของฉัน:
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
ฉันกรองมันตามความเหมาะสมที่เกี่ยวข้อง _object_id ... ไม่มี RX-X
หลังจากดำเนินการย้อนกลับฉันเห็น RX-X (LAST_MODE) เปิดตัวแม้ว่ามันจะไม่ได้รับมาก็ตาม
สิ่งที่ฉันได้ลอง
ฉันดูล็อคทั้งหมดในเหตุการณ์ที่ขยาย - ไม่มีการกรอง ไม่ได้ล็อค RX-X
ฉันลองใช้ Profiler: ผลลัพธ์เดียวกัน (ยกเว้นว่ามันจะได้ชื่อถูกต้อง ... ไม่ใช่ "LAST_MODE")
ฉันใช้งาน XE เพื่อเลื่อนระดับล็อค - มันไม่ได้อยู่ที่นั่น
ไม่มี XE เฉพาะสำหรับการแปลง แต่ฉันสามารถยืนยันได้ว่าอย่างน้อยที่สุดการแปลง U-X lock ถูกจับโดย
lock_acquired
สิ่งที่น่าสังเกตก็คือ RI-N ที่ได้มา แต่ไม่เคยปล่อยออกมา สมมติฐานในปัจจุบันของฉันอยู่ที่ RX-X เป็นล็อคแปลงตามที่อธิบายไว้ที่นี่ มีการล็อคช่วงคีย์ที่ทับซ้อนกันในชุดของฉันที่ดูเหมือนว่าควรมีคุณสมบัติสำหรับการแปลง แต่ล็อค RX-X ไม่ได้อยู่ในตารางการแปลง
ล็อคนี้มาจากไหนและเหตุใดเหตุใดจึงไม่รับเหตุการณ์เพิ่มเติม