实体框架中的事务作用域仅对特定连接有效吗?

时间:2018-08-08 19:58:35

标签: c# sql-server entity-framework-6

我正在Web应用程序中使用Entity Framework,并且有一段代码与事务内部的数据库进行通信,如下所示:

using (DbContextTransaction transScope = ctx.Database.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
    // some code here.
    transScope.Commit();
}

我所读取的隔离级别Serializable被认为是最高的隔离级别,甚至阻止了在此事务期间已访问的记录中的读取(这是我所需要的)。

但是,当我通过与SSMS的另一个连接访问SQL Server时(该事务处于中间执行状态),我能够访问此事务读取的行。

所以,我想知道的是:事务作用域和隔离级别仅对当前连接有效,还是对与数据库的所有连接有效?

已编辑

我要防止的是:

  1. 请求A读取ID为1的数据库中的记录。 C列的值为10。
  2. 请求B读取数据库中的相同记录。 C列的值为10。
  3. 请求A用C = 11的值更新记录。
  4. 请求B用C = 11的值更新记录。

在这种情况下,最终的值为11,但应为12。

1 个答案:

答案 0 :(得分:2)

交易-或更准确地说:它们持有并持有的锁-当然是数据库范围的-它们专门设计用于防止其他事务/会话执行某些操作。

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

But :默认情况下,读取交易使用共享锁(S),而请勿阻止其他交易读取行中的事务-顾名思义,共享锁可以在读取事务之间共享