Serializable 事务是否只锁定其他事务范围语句?还是一切?

ant*_*liu 1 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

}
Run Code Online (Sandbox Code Playgroud)

是否使我的隔离级别可序列化,以便如果我的代码中的其他任何地方我有这样的东西

MyEntities.Users.First(x=>x.name == "test")

该行代码将等到事务范围完全完成,或者该行代码是否需要包含在using(TrnasactionScope...语句中以使其遵循事务隔离级别的规则。

Mar*_*ell 5

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

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

但不是:事务范围不会阻塞其他所有内容,尤其是当它们只是读取时。对于它的作用......这很复杂,只能根据具体情况进行分析。