Vấn đề
Tôi có một cặp truy vấn, dưới sự cô lập tuần tự hóa, gây ra khóa RX-X. Tuy nhiên, khi tôi sử dụng Sự kiện mở rộng để xem việc mua lại khóa, việc mua lại khóa RX-X không bao giờ xuất hiện, nó chỉ được phát hành. Nó đến từ đâu?
Repro
Đây là bảng của tôi:
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')
Đây là lô vấn đề của tôi:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
INSERT dbo.LockTest
VALUES ('bleh')
SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()
--ROLLBACK
Tôi kiểm tra các khóa được giữ bởi phiên này và xem RX-X:
SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!
Nhưng tôi cũng có một sự kiện mở rộng trên lock_acquired
và lock_released
. Tôi lọc nó trên Associ_object_id thích hợp ... không có RX-X.
Sau khi thực hiện rollback, tôi thấy RX-X (LAST_MODE) được phát hành, mặc dù nó không bao giờ được mua lại.
Những gì tôi đã thử
Tôi đã xem xét tất cả các khóa trong Sự kiện mở rộng - không lọc. Không có khóa RX-X có được.
Tôi cũng đã thử Profiler: kết quả tương tự (tất nhiên ngoại trừ nó có tên đúng ... không "LAST_MODE").
Tôi đã chạy XE để leo thang khóa - nó không có ở đó.
Không có XE dành riêng cho chuyển đổi, nhưng tôi có thể xác nhận rằng ít nhất chuyển đổi khóa U thành X được nắm bắt bởi
lock_acquired
Cũng cần lưu ý là RI-N được mua nhưng không bao giờ được phát hành. Giả thuyết hiện tại của tôi là RX-X là một khóa chuyển đổi, như được mô tả ở đây . Có các khóa phạm vi khóa chồng chéo trong lô của tôi trông giống như chúng đủ điều kiện để chuyển đổi, nhưng khóa RX-X không có trong bảng chuyển đổi.
Khóa này đến từ đâu và tại sao nó không được chọn bởi Sự kiện mở rộng?