1

SQL サーバーでトランザクションの分離レベルを学習しているときに、問題に遭遇しました。

問題は、このコードを実行した後 (そしてエラーなしで終了した後):

set implicit_transactions off;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN T1;

SELECT (...)
WAITFOR DELAY '00:00:5' 
SELECT (...)
WAITFOR DELAY '00:00:3' 

COMMIT TRAN T1;

このクエリを実行したい:

set implicit_transactions off;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION T2;

INSERT (...)
INSERT (...)

COMMIT TRANSACTION T2;

しかし、「クエリを実行しています」と表示されるだけで、何もしません。最初のトランザクションが終了した後も、テーブルのロックが何らかの形で継続しているためだと思います。誰か助けてくれませんか?もちろん、選択と挿入は同じテーブルを参照します。

4

3 に答える 3

0

@usr は良い可能性を提供します。

関連する特定の可能性は、いじりながら実行する最初のトランザクションの一部のみを選択したことです。つまり、実行されBEGIN TRAN T1、実行されませんでしたCOMMIT TRAN T1。それは起こります - マーフィーの法則の一部だと思います。だけを実行してからCOMMIT TRAN T1、2 番目のスニペットを再試行してください。

以下は、1回のセッションで繰り返される完全な実行でうまくいきました:

set implicit_transactions off;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN T1;

SELECT * from tbl_A
WAITFOR DELAY '00:00:5' 
SELECT * from tbl_B
WAITFOR DELAY '00:00:3' 

COMMIT TRAN T1;


set implicit_transactions off;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION T2;

INSERT tbl_A (ModifiedDate) values (GETDATE())
INSERT tbl_B (ModifiedDate) values (GETDATE())
INSERT tbl_A (ModifiedDate) select top 1 ModifiedDate from tbl_A
INSERT tbl_B (ModifiedDate) select top 1 ModifiedDate from tbl_B

COMMIT TRANSACTION T2;
于 2014-01-12T20:47:37.710 に答える