データベース内のいくつかの条件をチェックし、フラグの結果を返すだけのユーティリティ プロシージャが多数あります。これらのプロシージャは、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
そんなことしていいの?一時的にアクティブ化された低い分離レベルは、何らかの形で高いレベルの保護を破りますか、それともすべてが完全に安全ですか?
編集:実行はエラーなしでスムーズに進みます。