我很好奇在数据库中使用带有SET READ_COMMITTED_SNAPSHOT ON的IsolationLevel.Snapshot的效果。 IsolationLevel枚举的documentation注意到Snapshot隔离的行为,这不是我们在我们的情况下所寻找的。 p>
启用READ_COMMITTED_SNAPSHOT后,我们是否应指定IsolationLevel.Unspecified,或者根本不提供此值?或者,如果我们指定IsolationLevel.Snapshot,我们是否会在启用READ_COMMITTED_SNAPSHOT时实现预期的行为?
谢谢!
答案 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();
}
谁的输出是:
正如您所看到的,当您在 TransactionOptions 中将 IsolationLevel 设置为 Snapshot 时,存储过程将在“Snapshot”隔离下执行级别,以及“读取提交的快照”下的不。
相反,如果您将 IsolationLevel 设置为 ReadCommitted ,则 在“读取提交的快照”下执行
。希望它有所帮助。