我在 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),并且那些不会阻止其他事务读取这些行 - 顾名思义,可以在读取事务之间共享共享锁。
- 1 回答
- 0 关注
- 182 浏览
添加回答
举报
0/150
提交
取消