ADO.Net IsolationLevel.Snapshot,SET READ_COMMITTED_SNAPSHOT ON

时间:2013-01-16 18:58:09

标签: c# ado.net read-committed-snapshot

我很好奇在数据库中使用带有SET READ_COMMITTED_SNAPSHOT ON的IsolationLevel.Snapshot的效果。 IsolationLevel枚举的documentation注意到Snapshot隔离的行为,这不是我们在我们的情况下所寻找的。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

我创建了以下存储过程以返回上下文隔离级别(原始来自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();
}

谁的输出是: Test output

正如您所看到的,当您在 TransactionOptions 中将 IsolationLevel 设置为 Snapshot 时,存储过程将在“Snapshot”隔离下执行级别,以及“读取提交的快照”下的

相反,如果您将 IsolationLevel 设置为 ReadCommitted ,则 在“读取提交的快照”下执行

希望它有所帮助。