我怀疑我并不完全理解发生了什么或者发生了什么奇怪的事情。 (我猜的第一种情况更有可能。)
大局:
以下是我目前用于测试交易的代码示例(首先使用Entity Framework 5模型):
using (var transaction = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.RequiresNew, new System.Transactions.TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.Snapshot }))
{
var db = new DataModelContainer();
Log test = new Log();
test.Message = "TEST";
test.Date = DateTime.UtcNow;
test.Details = "asd";
test.Type = "test";
test.StackTrace = "asd";
db.LogSet.Add(test);
db.SaveChanges();
using (var suppressed = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Suppress))
{
var newDb = new DataModelContainer();
var log = newDb.LogSet.ToArray(); //deadlock here... WHY?
}
test = db.LogSet.Where(l => l.Message == "TEST").Single();
db.LogSet.Remove(test);
db.SaveChanges();
transaction.Complete();
}
代码在数据库中创建一个简单的日志条目(是的,我现在正在玩这个值,所以值是垃圾)。我已经设置了SQL数据库以允许快照隔离,据我所知,仍然应该允许读取(这些正在使用新的,被抑制的事务和新的DataModelContainer
在此代码中进行测试)。但是,我无法在被抑制的事务或SQL Management Studio中查询LogSet
- 整个表都被锁定了!
那么......为什么?如果事务范围被定义为什么它被锁定?我也尝试过其他隔离级别(比如ReadUncommited
),我仍然无法查询表格。
有人可以就此行为提供解释吗?
答案 0 :(得分:1)
在SSMS中,将当前的隔离级别设置为SNAPSHOT
并查看是否可以纠正您的问题 - 它可能设置为READ COMMITTED
,因此会因挂起的更新而阻止。
更新
您可以通过更改以下选项(并避免不断将当前隔离级别设置为READ COMMITTED
)来允许SNAPSHOT
访问数据库范围内的版本行:
ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON