3

私は、データベースのいくつかの条件をチェックし、フラグの結果を返すだけのユーティリティ手続きを持っています。これらのプロシージャーは、READ UNCOMMITTED分離レベル(WITH NOLOCKと同等)で実行されます。あるストアドプロシージャ内から、より低いトランザクション分離レベルを設定する別のストアドプロシージャを呼び出すことはできますか?

また、SERIALIZABLE分離レベルで実行されるより複雑な手順もあります。彼らはまた、同じ種類の小切手を持っていることもあります。

私は、チェックコードを複製するのではなく、これらの複雑な手順からこれらのチェック手順を呼び出すことにしました。

は、基本的には次のようになります。

CREATE PROCEDURE [dbo].[CheckSomething] 
AS 
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

    BEGIN TRANSACTION 

    -- Do checks 

    COMMIT TRANSACTION 

CREATE PROCEDURE [dbo].[DoSomethingImportant] 
AS 
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

    BEGIN TRANSACTION 

    EXECUTE [dbo].[CheckSomething] 

    -- Do some work 

    COMMIT TRANSACTION 

は、それを行うには大丈夫でしょうか?一時的に活性化された低いアイソレーションレベルは、何らかの理由でより高いレベルの保護を破るか、または完全に安全なものですか?

EDIT:エラーはスムーズに実行されます。

答えて

5

これは、SQL Server 2005のスニペット用all hereです:

あなたが別の 分離レベルからトランザクションを変更すると、変更後に読み込まれたリソース が のルールに従って を保護されています新しいレベル。変更する前に を読み取ったリソースは、前のレベルの のルールに従って保護されています。たとえば、 トランザクションがREAD COMMITTEDからSERIALIZABLEに変更された場合、変更後に取得された共有 ロックは、 トランザクションが終了するまで保持されるようになりました( )。

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

:CheckSomethingで使用

  • 各分離レベルをDoSomethingImportantによってロックストアドプロシージャ
  • リソースの範囲に適用されるSERIALIZABLE
  • 下にとどまる
  • リソースはUNCOMMITTED
  • 読み出されます
+0

明確化のおかげで、これを過去にしたとき、私はストアドプロシージャの外にあったので、動作はdifferen t –

関連する問題