我正在Web应用程序中使用Entity Framework,并且有一段代码与事务内部的数据库进行通信,如下所示:
using (DbContextTransaction transScope = ctx.Database.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
// some code here.
transScope.Commit();
}
我所读取的隔离级别Serializable
被认为是最高的隔离级别,甚至阻止了在此事务期间已访问的记录中的读取(这是我所需要的)。
但是,当我通过与SSMS的另一个连接访问SQL Server时(该事务处于中间执行状态),我能够访问此事务读取的行。
所以,我想知道的是:事务作用域和隔离级别仅对当前连接有效,还是对与数据库的所有连接有效?
已编辑
我要防止的是:
在这种情况下,最终的值为11,但应为12。
答案 0 :(得分:2)
交易-或更准确地说:它们持有并持有的锁-当然是数据库范围的-它们专门设计用于防止其他事务/会话执行某些操作。
是的,Serializable
隔离级别是“最高”,最严格的隔离级别-如果您的事务读取行并在WHERE
子句中使用某些条件,则SQL Server将使用基于范围的(S)共享锁,以防止任何其他交易修改(更新,删除甚至插入这些锁定范围内)任何数据。
But :默认情况下,读取交易使用共享锁(S),而请勿阻止其他交易读取行中的事务-顾名思义,共享锁可以在读取事务之间共享 。