Serializable事务是否仅锁定其他transactioncope语句?还是一切?

时间:2012-09-09 18:50:45

标签: c# asp.net entity-framework transactionscope

在我有以下内容的交易中,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>

1 个答案:

答案 0 :(得分:4)

隔离级别本身什么都不做;重要的是当您开始查询数据时会发生什么。特别是,您开始在整个地方和键范围锁中留下读锁。如果另一个查询遇到其中一个锁并且正在读,那就没关系:读锁通常是兼容的。显然,其他SPID的隔离级别也很重要 - 读取未提交的SPID将不关心您正在进行的操作,因为更高的隔离将会发生。

开始变得更复杂的是当其中一个SPID开始数据时;如果多个SPID已经对同一数据具有读锁定,则可能导致死锁。

但不是:事务范围不会阻止其他所有内容,特别是如果他们只是阅读。对于做什么做什么......这很复杂,只能根据具体情况进行分析。