当我发出“SaveChanges()”时,实体框架中的默认事务隔离级别是什么?

时间:2011-04-14 00:09:36

标签: .net entity-framework ado.net transactions

当我发出“SaveChanges()”时,实体框架中的默认事务隔离级别是什么?我找不到任何地方。它应该是“Serializable”吗?

3 个答案:

答案 0 :(得分:40)

SaveChanges使用DbTransaction对当前商店提供商的实施。这意味着默认事务隔离级别设置为数据库服务器的默认值。在SQL Server中,它是READ COMMITTED。如果要更改隔离级别,可以使用TransactionScope。您还可以在派生上下文中覆盖SaveChanges,并直接在overriden方法中将base.SaveChanges()包装到范围中。

public override void SaveChanges()
{
    // Default isolation level for TransactionScope is Serializable
    using (var scope = new TransactionScope())
    {
        base.SaveChanges();
        scope.Complete();
    }
}

您可以进一步改进此代码,以便将隔离级别传递给SaveChanges等。一旦开始更改隔离级别,就应该始终如一地执行此操作。这意味着您应该在每次要运行事务时定义隔离级别,因为isolation level is configured per connection和连接在使用连接池时会被重用。

修改:EF6中的默认交易级别已更改为READ COMMITTED SNAPSHOT

答案 1 :(得分:4)

默认情况下,System.Transactions基础结构会创建Serializable事务。

答案 2 :(得分:0)

从EF 6开始,SQL Server事务的默认隔离级别为READ COMMITTED。参考文献如下:Entity Framework Working with Transactions (EF6 Onwards)

对于其他提供程序(相同的引用)“事务的隔离级别是数据库提供程序认为其默认设置的任何隔离级别”。因此,您必须查看该提供商的文档。