在交易中我有以下内容,MyEntities 是我的上下文:
TransactionOptions options = new TransactionOptions();
options.Timeout = TimeSpan.FromMinutes(1);
options.IsolationLevel = IsolationLevel.Serializable;
using(TransactionScope scope =
new TransactionScope(TransactionScopeOption.Required, options))
{
//Do something to database table MyEntities.Users
}
是否使我的隔离级别可序列化,如果我的代码中的任何其他地方都有这样的东西
MyEntities.Users.First(x=>x.name == "test")
这行代码会一直等到事务范围完全完成,或者那行代码是否需要包含在 using(TrnasactionScope... 语句中,以便它遵循事务隔离级别规则。
请您参考如下方法:
隔离级别本身什么都不做;重要的是当您开始查询数据时会发生什么。特别是,您开始到处留下读锁和键范围锁。如果另一个查询命中其中一个锁并且正在读,那没关系:读锁通常是兼容的。另一个 SPID 的隔离级别也很重要,显然 - 未提交读取的 SPID 不会关心您正在进行的操作,而更高的隔离级别会。
当其中一个 SPID 开始写入数据时,事情开始变得更加复杂;如果多个 SPID 已经对同一数据具有读取锁定,则可能导致死锁。
但不是:事务作用域不会阻止一切,尤其是当它们只是阅读时。对于它做做的事情......这很复杂,只能根据具体情况进行分析。
