1

仕事:

一部の行を更新してロールバックする最初のトランザクション (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」が表示されます

4

2 に答える 2

1

すべての DML は、常に X ロックを取得します。これは、ロールバックを確実に実行できるようにするためです。これはエンジンの核となる原理です。

別のアプローチが必要です。とにかく、ロックを使って風変わりなことをするのはお勧めできません。

あなたが達成しようとしていることを知らなければ、より良い代替案を提案することはできません.

于 2015-05-25T09:58:18.890 に答える
0

「with (nolock)」または「READ_COMMITTED_SNAPSHOT = false」を使用して待機なしで行を読み取ることはできますが、排他ロックなしで行を更新または削除することはできません..

于 2015-05-25T07:13:18.677 に答える