2

我很好奇在数据库上使用 IsolationLevel.Snapshot 和 SET READ_COMMITTED_SNAPSHOT ON 的效果。IsolationLevel 枚举的文档记录了快照隔离的行为,这不是我们在我们的情况下要寻找的。

启用 READ_COMMITTED_SNAPSHOT 后,我们应该指定 IsolationLevel.Unspecified,还是根本不提供此值?或者,如果我们确实指定了 IsolationLevel.Snapshot,我们会实现启用 READ_COMMITTED_SNAPSHOT 的预期行为吗?

谢谢!

4

2 回答 2

1

我已经使用 SQL 2008 R2 和 Entity Framework 4 完成了以下测试。(数据库的 READ_COMMITTED_SNAPSHOT 选项为 ON)

我创建了以下存储过程来返回上下文隔离级别(来自这里的原始文件):

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中将IsolationLevel设置为Snapshot时,存储过程在“Snapshot”隔离级别下执行,而不是在“Read Committed Snapshot”下执行。

相反,如果您将IsolationLevel设置为ReadCommitted,它将在“Read Committed Snapshot”下执行

希望能帮助到你。

于 2013-10-22T03:45:10.507 回答
1

如果您在 DB 级别启用了 read_committed_snapshot,那么除非修改,否则所有查询都将具有该默认隔离级别。

如果您更改查询本身的隔离级别,则查询将使用您修改它的隔离级别。

于 2013-01-16T22:23:11.333 回答