2

データベースで SET READ_COMMITTED_SNAPSHOT ON を指定して IsolationLevel.Snapshot を使用した場合の影響について興味があります。IsolationLevel 列挙のドキュメントには、スナップショット分離からの動作が記載されていますが、これは私たちの状況で探しているものではありません。

READ_COMMITTED_SNAPSHOT を有効にした後、IsolationLevel.Unspecified を指定する必要がありますか、それともこの値をまったく指定しないでください。または、IsolationLevel.Snapshot を指定した場合、READ_COMMITTED_SNAPSHOT を有効にした場合に期待される動作を実現できますか?

ありがとう!

4

2 に答える 2

1

DBレベルでread_committed_snapshotを有効にした場合、変更されない限り、すべてのクエリはそのデフォルトの分離レベルになります。

クエリ自体の分離レベルを変更すると、クエリは変更した分離レベルを使用します。

于 2013-01-16T22:23:11.333 に答える
1

SQL 2008 R2 と Entity Framework 4 を使用して次のテストを実行しました (データベースの READ_COMMITTED_SNAPSHOT オプションがオンになっています)。

コンテキスト分離レベルを返すために、次のストアド プロシージャを作成しました (オリジナルはhereから)。

Create Procedure TempTestIsolation
AS 
Begin
  DECLARE   @UserOptions TABLE(SetOption varchar(100), Value varchar(100))
  INSERT    @UserOptions
  EXEC('DBCC USEROPTIONS WITH NO_INFOMSGS')

  SELECT    Value
  FROM      @UserOptions
  WHERE     SetOption = 'isolation level'
End

そして、次のテストをコーディングしました。

static void Main(string[] args)
{
    var entities = new MyEntities();
    // Execute the SP to get the isolation level
    string level = entities.TempTestIsolation().First().Value;
    Console.WriteLine("Without a transaction: " + level);

    var to = new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.Snapshot };
    using (var ts = new TransactionScope(TransactionScopeOption.Required, to))
    {
        // Execute the SP to get the isolation level
        level = entities.TempTestIsolation().First().Value;
        Console.WriteLine("With IsolationLevel.Snapshot: " + level);
    }

    to = new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted };
    using (var ts = new TransactionScope(TransactionScopeOption.Required, to))
    {
        // Execute the SP to get the isolation level
        level = entities.TempTestIsolation().First().Value;
        Console.WriteLine("With IsolationLevel.ReadCommitted: " + level);
    }
    Console.ReadKey();
}

その出力は次のとおりです。 テスト出力

ご覧のとおり、 TransactionOptionsでIsolationLevelSnapshotに設定すると、ストアド プロシージャは "スナップショット" 分離レベルで実行され、"コミットされたスナップショットの読み取り"では実行されません。

代わりに、IsolationLevelReadCommittedに設定すると、 「コミットされたスナップショットの読み取り」で実行されます。

それが役に立てば幸い。

于 2013-10-22T03:45:10.507 に答える