3

データベース内のいくつかの条件をチェックし、フラグの結果を返すだけのユーティリティ プロシージャが多数あります。これらのプロシージャは、WITH NOLOCK と同等の READ UNCOMMITTED 分離レベルで実行されます。

また、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

そんなことしていいの?一時的にアクティブ化された低い分離レベルは、何らかの形で高いレベルの保護を破りますか、それともすべてが完全に安全ですか?

編集:実行はエラーなしでスムーズに進みます。

4

1 に答える 1

5

SQL Server 2005 用のすべてがここにあります。スニペット:

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

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

この例では:

  • 各分離レベルは、ストアド プロシージャのスコープに適用されます
  • DoSomethingImportant によってロックされたリソースは SERIALIZABLE の下に留まります
  • CheckSomething が使用するリソースは READ UNCOMMITTED です
于 2009-04-25T12:46:55.437 に答える