在事务中,我具有以下内容,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已经在同一数据上具有读取锁,则可能导致死锁。

但不能:事务范围不会阻止其他所有内容,尤其是在它们仅在读取的情况下。对于它所做的事情,这是很复杂的,并且只能根据具体情况进行分析。

10-07 19:21
查看更多