仕事:
一部の行を更新してロールバックする最初のトランザクション (T1) を開きます (常に)
同時に (T1 を開いた後、ロールバックする前に) 他のトランザクション T2 が同じ行を変更してコミットできます。
この場合、T2 は T1 を待機します (READ_COMMITTED_SNAPSHOT 分離レベルを使用)
待たずにできますか?
例: 最初のクエリ ウィンドウ
IF NOT EXISTS ( SELECT *
FROM sysobjects
WHERE name = 'TestLockTable'
AND xtype = 'U' )
BEGIN
CREATE TABLE TestLockTable
(
Id INT NOT NULL ,
Name VARCHAR(64) NOT NULL
)
END
INSERT INTO dbo.TestLockTable
( Id, Name )
VALUES ( 1, 'test' )
BEGIN TRANSACTION T1
UPDATE dbo.TestLockTable
SET Name = 'test1'
WHERE Id = 1;
2番:
BEGIN TRANSACTION T2
SELECT *
FROM dbo.TestLockTable
WHERE Id = 1; --Select 'test' without wait
UPDATE dbo.TestLockTable
SET Name = 'test2'
WHERE Id = 1; --This T2 hang on
COMMIT TRANSACTION T2
そして最後:
ROLLBACK TRANSACTION T1
T1 のロールバック後、T2 はコミットでき、行に「test2」が表示されます