41

SQL Server 2005のトランザクション分離レベルのスコープルールは何ですか?さまざまなレベルの意味はわかっていますが、手動で実行するスクリプトの外部でそれらを適切に適用する方法はわかりません。本番品質のコードで実用的なガイドが見つかりません。

明らかに、スコープは次のようなコマンドを使用すると始まります。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

しかし、それはどこで終わりますか?ストアドプロシージャでisoレベルを設定し、そのprocが別のプロシージャを呼び出す場合、ネストされたprocはそれを継承しますか?さらに良いことに、ネストされたproc内のisoレベルをエスカレートすると、呼び出し元のprocに戻されますか?BEGIN TRAN、ROLLBACK、COMMITなどのトランザクションコマンドは何か違いがありますか?

ストアドプロシージャがアプリケーションまたはエージェントジョブによって呼び出された場合、分離レベルの変更は何らかの方法で持続しますか?各プロシージャの最後に、常にデフォルトのREAD COMMITTEDに戻す必要がありますか?

さまざまな状況でテストしますが、現在の分離レベルが何に設定されているかを読み取る方法がわかりません。

4

6 に答える 6

37

以下を実行して、自分の目で確かめてください。

CREATE PROCEDURE dbo.KeepsIsolation
AS
BEGIN
PRINT 'Inside sproc that does not change isolation level';
DBCC USEROPTIONS;
END
GO

CREATE PROCEDURE dbo.ChangesIsolation
AS
BEGIN
PRINT 'Inside sproc that changes isolation level';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
DBCC USEROPTIONS;
END
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
DBCC USEROPTIONS;
EXEC dbo.KeepsIsolation;
DBCC USEROPTIONS;
EXEC dbo.ChangesIsolation;
-- demonstrates that isolation level restored to REPEATABLE READ after exiting the procedure
    DBCC USEROPTIONS;
于 2009-06-25T20:09:02.707 に答える
17

MSDNから

ストアドプロシージャまたはトリガーでSETTRANSACTIONISOLATION LEVELを発行すると、オブジェクトが制御を返すと、分離レベルはオブジェクトが呼び出されたときに有効だったレベルにリセットされます。たとえば、バッチでREPEATABLE READを設定し、そのバッチが分離レベルをSERIALIZABLEに設定するストアドプロシージャを呼び出す場合、ストアドプロシージャが制御をバッチに戻すと、分離レベルの設定はREPEATABLEREADに戻ります。

于 2014-02-06T18:35:32.160 に答える
14

DBCC USEROPTIONS他のすべてのSETオプションとともに、現在の分離レベルが表示されます。

于 2009-06-25T19:19:39.797 に答える
4

オンラインの本から

一度に設定できるTRANSACTIONISOLATIONLEVELオプションは1つだけであり、明示的に変更されるまで、その接続に対して設定されたままになります。ステートメントのFROM句でテーブルレベルで最適化オプションが指定されていない限り、これがデフォルトの動作になります。

于 2009-06-25T19:08:56.603 に答える
2

分離レベルはトランザクションでロールバックされません。

プロシージャや関数を呼び出しても、分離レベルは最新の状態に保たれます。

于 2009-06-25T19:03:55.367 に答える
0

高性能のADO.NET接続プールを使用すると、トランザクションレベルとSqlServer 2012以前のスコープに問題があり、接続を閉じても実際に持続する可能性があることに注意してください。

SQL Server:プールされた接続間での分離レベルのリーク

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/916b3d8a-c464-4ad5-8901-6f845a2a3447/sql-server-2014-reseting-isolation-level?forum=sqldatabaseengine

于 2015-12-22T06:24:26.167 に答える