猿问

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

我在 Web 应用程序中使用实体框架,并且有一段代码与事务中的数据库通信,如下所示:


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。


弑天下
浏览 183回答 1
1回答

森栏

事务——或者更准确地说:它们持有和持有的锁——当然是数据库范围的——它们是专门设计来防止其他事务/会话做某些事情的。是的,Serializable隔离级别是“最高”、最严格的隔离级别——如果您的事务读取行并使用WHERE子句中的某些条件,SQL Server 将使用基于范围(S)的共享锁来防止任何其他事务修改(更新、删除甚至插入到这些锁定范围内)任何数据。但是:默认情况下,读取事务使用共享锁(S),并且那些不会阻止其他事务读取这些行 - 顾名思义,可以在读取事务之间共享共享锁。
随时随地看视频慕课网APP
我要回答