.net 当我发布“;SaveChanges()”;?
当我发出“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
使用当前商店提供商的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选项的解释。我错过什么了吗?