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

Big*_*ger 34 .net ado.net entity-framework transactions

当我发出"SaveChanges()"时,实体框架中的默认事务隔离级别是什么?我找不到任何地方.它应该是"可序列化的"吗?

Lad*_*nka 43

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

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

您可以进一步改进此代码以允许您将隔离级别传递给SaveChanges等等.一旦开始更改隔离级别,您应该始终如一地执行此操作.这意味着您应该在每次要运行事务时定义隔离级别,因为每个连接都配置了隔离级别,并且在使用连接池时会重用连接.

编辑: EF6中的默认事务级别已更改为READ COMMITTED SNAPSHOT

  • @Ladislav Mrnka,也许我错了,但"READ_COMMITTED_SNAPSHOT"不应该是一个隔离级别.它应该是一个可以设置的选项,以便修改"READ_COMMITTED"隔离级别的行为.另一方面,如果必须在SQL Server上显式启用此选项,EF如何默认使用"READ_COMMITTED_SNAPSHOT"?隔离级别记录在这里https://msdn.microsoft.com/en-us/library/ms173763.aspx,顺便在同一个链接我们可以找到READ_COMMITTED_SNAPSHOT选项的解释.我错过了什么吗? (6认同)