.net 当我发布“;SaveChanges()”;?

.net 当我发布“;SaveChanges()”;?,.net,entity-framework,ado.net,transactions,.net,Entity Framework,Ado.net,Transactions,当我发出“SaveChanges()”时,实体框架中的默认事务隔离级别是什么?我到处都找不到。它应该是“可序列化的”吗?SaveChanges使用当前商店提供商的DbTransaction实现。这意味着默认事务隔离级别被设置为数据库服务器的默认值。在SQL Server中,它是读取提交的。如果要更改隔离级别,可以使用TransactionScope。您还可以在派生上下文中重写SaveChanges,并将base.SaveChanges()直接包装到重写方法中的作用域 public overrid

当我发出“SaveChanges()”时,实体框架中的默认事务隔离级别是什么?我到处都找不到。它应该是“可序列化的”吗?

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

public override void SaveChanges()
{
    // Default isolation level for TransactionScope is Serializable
    using (var scope = new TransactionScope())
    {
        base.SaveChanges();
        scope.Complete();
    }
}
您可以进一步改进此代码,以允许您将隔离级别传递给
SaveChanges
等。一旦您开始更改隔离级别,您应该始终如一地这样做。这意味着您应该在每次运行事务时定义隔离级别,因为在使用连接池时会重用和连接


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

默认情况下,System.Transactions基础结构创建可序列化事务。

自EF6起,SQL Server事务的默认隔离级别为READ COMMITTED。参考资料如下:


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

由于代码必须发生在事务本身的范围内,这难道没有用吗?可能需要将base.savechanges封装到try cacth中,以便在base.savechanges失败时执行scope.complete:
catch e{scope.complete();throw}
@ChadMoran,你能解释一下你的评论吗?关于这个答案的其他数据如下:@Ladislav Mrnka,也许我错了,但“READ\u COMMITTED\u SNAPSHOT”不应该是隔离级别。它应该是一个可以设置的选项,以便修改“READ_COMMITTED”隔离级别的行为。另一方面,如果必须在SQL Server上显式启用此选项,EF如何默认使用“READ_COMMITTED_SNAPSHOT”?这里记录了隔离级别,顺便说一句,在同一个链接中,我们可以找到READ_COMMITTED_SNAPSHOT选项的解释。我错过什么了吗?