在事务中,我具有以下内容,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已经在同一数据上具有读取锁,则可能导致死锁。
但不能:事务范围不会阻止其他所有内容,尤其是在它们仅在读取的情况下。对于它所做的事情,这是很复杂的,并且只能根据具体情况进行分析。