在我有以下内容的交易中,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...
语句中包含,以使其遵循事务隔离级别的规则。 / p>
答案 0 :(得分:4)
隔离级别本身什么都不做;重要的是当您开始查询数据时会发生什么。特别是,您开始在整个地方和键范围锁中留下读锁。如果另一个查询遇到其中一个锁并且正在读,那就没关系:读锁通常是兼容的。显然,其他SPID的隔离级别也很重要 - 读取未提交的SPID将不关心您正在进行的操作,因为更高的隔离将会发生。
开始变得更复杂的是当其中一个SPID开始写数据时;如果多个SPID已经对同一数据具有读锁定,则可能导致死锁。
但不是:事务范围不会阻止其他所有内容,特别是如果他们只是阅读。对于做什么做什么......这很复杂,只能根据具体情况进行分析。