Skip to main content
 首页 » 编程设计

c#之Serializable transactions 是否只锁定其他 transactionscope 语句还是一切

2024年02月20日32小虾米

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

但不是:事务作用域不会阻止一切,尤其是当它们只是阅读时。对于它做做的事情......这很复杂,只能根据具体情况进行分析。