SQL Serverのネストされたトランザクションの分離の範囲は何ですか?
-
03-07-2019 - |
質問
次のSQLを検討してください:
BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ COMMITTED INSERT Bands ( Name ) SELECT 'Depeche Mode' UNION SELECT 'Arcade Fire' -- I've indented the inner transaction to make it clearer. BEGIN TRAN SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM Bands COMMIT -- What is the isolation level right here? UPDATE Bands SET Name = 'Modest Mouse' WHERE Name = 'Oddest House' COMMIT
要するに、トランザクションを開始し、その分離レベルを READ COMMITTED
に設定します。次に、ランダムなSQLを実行し、別のネストされたトランザクションを開始します。このトランザクションでは、分離レベルを READ UNCOMMITTED
に変更します。次に、そのトランザクションをコミットして、もう一方に戻ります。
今、私の推測では、内部コミットの後、分離レベルは READ COMMITTED
に戻ります。これは正しいですか?
解決
他のヒント
あなた[Bob Probst]は正しいです。興味深いことに、リンクしたドキュメントによれば、
ストアドプロシージャまたはトリガーでSET TRANSACTION ISOLATION LEVELを発行すると、オブジェクトが制御を返すと、分離レベルはオブジェクトが呼び出されたときに有効なレベルにリセットされます。たとえば、バッチでREPEATABLE READを設定し、そのバッチが分離レベルをSERIALIZABLEに設定するストアドプロシージャを呼び出した場合、ストアドプロシージャがバッチに制御を返すと、分離レベルの設定はREPEATABLE READに戻ります。
つまり、ここで一番下の行は、SET TRANSACTION ISOLATION LEVELが transaction affinity ではなく procedure affinity であるということです(思ったとおりです)。
素晴らしい!
所属していません StackOverflow