问题
我有一对可串行隔离的查询,它们导致RX-X锁定。但是,当我使用扩展事件来观察锁获取时,RX-X锁获取从未出现,它仅被释放。它从何而来?
再现
这是我的桌子:
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
。我在适当的associated_object_id上对其进行过滤...没有RX-X。
执行回滚后,即使从未获得过RX-X(LAST_MODE),我也看到它已发布。
我尝试过的
我查看了扩展事件中的所有锁-没有过滤。未获得RX-X锁。
我还尝试了Profiler:相同的结果(当然,它的名称正确...没有“ LAST_MODE”)。
我运行XE进行锁升级-它不在那里。
没有专门用于转换的XE,但我能够确认至少U到X锁定转换已被捕获
lock_acquired
还值得注意的是被收购但从未发布的RI-N。我现在的假设是,RX-X是一个转换锁,如所描述这里。我的批处理中有重叠的键范围锁,看起来它们应该可以进行转换,但是RX-X锁不在转换表中。
此锁来自何处,为什么扩展事件未将其锁定?