为了账号安全,请及时绑定邮箱和手机立即绑定

实体框架中的事务范围是否仅对特定连接有效?

实体框架中的事务范围是否仅对特定连接有效?

C#
弑天下 2021-11-21 10:50:30
我在 Web 应用程序中使用实体框架,并且有一段代码与事务中的数据库通信,如下所示:using (DbContextTransaction transScope = ctx.Database.BeginTransaction(System.Data.IsolationLevel.Serializable)){    // some code here.    transScope.Commit();}隔离级别Serializable,从我读到的应该是最高级别的隔离,甚至阻止读取在此事务期间访问过的记录(这是我需要的)。但是,当我通过另一个与 SSMS 的连接访问 SQL Server 时(在此事务执行期间),我能够访问此事务读取的行。所以,我想知道的是:事务范围和隔离级别仅对当前连接有效,还是对所有到数据库的连接都有效?已编辑我试图阻止的是:请求 A 读取数据库中 id 为 1 的记录。C 列的值为 10。请求 B 读取数据库中的相同记录。C 列的值为 10。请求 A 使用值 C = 11 更新记录。请求 B 使用值 C = 11 更新记录。在这种情况下,最终值将是 11,但它应该是 12。
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

事务——或者更准确地说:它们持有和持有的锁——当然是数据库范围的——它们是专门设计来防止其他事务/会话做某些事情的。

是的,Serializable隔离级别是“最高”、最严格的隔离级别——如果您的事务读取行并使用WHERE子句中的某些条件,SQL Server 将使用基于范围(S)的共享锁来防止任何其他事务修改(更新、删除甚至插入到这些锁定范围内)任何数据。

但是:默认情况下,读取事务使用共享锁(S),并且那些不会阻止其他事务读取这些行 - 顾名思义,可以在读取事务之间共享共享锁。


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信