实体框架类型的读锁定

时间:2016-01-13 12:27:24

标签: sql-server entity-framework

实体框架的默认读锁是什么,以及如何实现可重复读锁。

我想也许某个地方可能存在全局设置,因此默认情况下会获取类型可重复读取的读锁定,然后在保存更改启动后释放。

What is the default transaction isolation level in Entity Framework when I issue “SaveChanges()”?。这里假设默认隔离级别是快照。如何更改为可重复读取。

1 个答案:

答案 0 :(得分:0)

Msdn告诉默认隔离模式与数据库有关。

它还提供了一个如何处理事务的示例,这是您需要从隔离模式repeatable read中获益的方法。要注意,他们的例子有一个非常讨厌的缺陷,因为它会吞下任何异常。

以下是他们示例的固定版本。 context应该是从DBContext派生的类的实例。

        using (var dbContextTransaction = 
            context.Database.BeginTransaction(
                System.Data.IsolationLevel.RepeatableRead))
        {
            try
            {
                // Your work here, then

                context.SaveChanges();
                dbContextTransaction.Commit();
            }
            catch
            {
                dbContextTransaction.Rollback();
                throw;
            }
        }

正如Panagiotis Kanavos所警告的那样,应尽可能避免这种锁定。它会降低可扩展性,增加死锁风险,只要事务正在运行,就可能完全阻止其他用户......

try catch rollback可能被认为是多余的,因为处理正在进行的System.Data.SqlClient.SqlTransaction会导致它回滚(而using将确保它被处置掉)。但由于具体事务可能属于其他类型,具体取决于使用的数据存储,因此在发生故障时显式回滚更安全。