問題
シリアライズ可能な分離の下で、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
ます。適切なrelated_object_idでフィルタリングします... RX-Xはありません。
ロールバックを実行した後、RX-X(LAST_MODE)がリリースされましたが、取得されていません。
私が試したこと
拡張イベントですべてのロックを確認しました-フィルタリングはありません。RX-Xロックが取得されていません。
プロファイラーも試してみました:同じ結果です(もちろん名前が正しくなりますが、「LAST_MODE」はありません)。
ロックのエスカレーションのためにXEを実行しました-それはありません。
変換専用のXEはありませんが、少なくともUからXロックへの変換がキャプチャされることを確認できました
lock_acquired
また、注目されるのは、取得されるが決してリリースされないRI-Nです。私の現在の仮説は、RX-Xがここで説明されているように変換ロックであるということです。バッチには重複するキー範囲ロックがあり、それらは変換の対象となるように見えますが、RX-Xロックは変換テーブルにありません。
このロックはどこから来たのですか、そしてなぜ拡張イベントによって受け取られないのですか?