SQL Serverのネストされたトランザクションの分離の範囲は何ですか?

StackOverflow https://stackoverflow.com/questions/223436

  •  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 に戻ります。これは正しいですか?

役に立ちましたか?

解決

それは正しいとは思わない。

こちらの備考を参照:トランザクションを設定

  

分離レベルの1つのみ   オプションは一度に設定できます   その接続に設定されたままになるまで   明示的に変更されます。

他のヒント

あなた[Bob Probst]は正しいです。興味深いことに、リンクしたドキュメントによれば、

  

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

つまり、ここで一番下の行は、SET TRANSACTION ISOLATION LEVELが transaction affinity ではなく procedure affinity であるということです(思ったとおりです)。

素晴らしい!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top