8

次の SQL を検討してください。

トラン開始
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

INSERT バンド
    ( 名前 )
「デペッシュ・モード」を選択
連合
「アーケードファイア」を選択

    -- わかりやすくするために、内部トランザクションをインデントしました。

    トラン開始
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    選択する *
      フロムバンド

    専念

-- ここでの分離レベルは?

更新バンド
   SET Name = 'Modest Mouse'
 WHERE Name = '奇妙な家'

専念

つまり、トランザクションを開始し、その分離レベルを に設定しますREAD COMMITTED。次に、ランダムな SQL を実行し、ネストされた別のトランザクションを開始します。このトランザクションでは、分離レベルを に変更しREAD UNCOMMITTEDます。次に、そのトランザクションをコミットして、もう一方に戻ります。

さて、私の推測では、内部コミットの後、分離レベルは に戻りますREAD COMMITTED。これは正しいです?

4

2 に答える 2

11

あなた[ボブ・プロブスト]は正しいです。興味深いことに、リンクしたドキュメントによると:

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

したがって、ここでの結論は、SET TRANSACTION ISOLATION LEVELにはトランザクション アフィニティではなく、プロシージャ アフィニティがあるということです (私が考えていたように)。

素晴らしい!

于 2008-10-22T07:37:00.257 に答える
8

それは正しくないと思います。

ここの備考を参照してください: Set Transaction

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

于 2008-10-21T21:13:37.283 に答える