【发布时间】:2011-04-14 00:09:35
【问题描述】:
当我发出“SaveChanges()”时,Entity Framework 中的默认事务隔离级别是什么?我在任何地方都找不到它。应该是“Serializable”吗?
【问题讨论】:
标签: .net entity-framework ado.net transactions
当我发出“SaveChanges()”时,Entity Framework 中的默认事务隔离级别是什么?我在任何地方都找不到它。应该是“Serializable”吗?
【问题讨论】:
标签: .net entity-framework ado.net transactions
SaveChanges 使用 DbTransaction 的实现作为当前商店提供程序。这意味着默认事务隔离级别设置为数据库服务器的默认值。在 SQL Server 中,它是 READ COMMITTED。如果要更改隔离级别,可以使用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 等。一旦您开始更改隔离级别,您应该始终如一地执行此操作。这意味着您应该在每次要运行事务时定义隔离级别,因为isolation level is configured per connection 和连接在使用连接池时会被重用。
编辑: EF6 中的默认事务级别已更改为 READ COMMITTED SNAPSHOT
【讨论】:
catch e { scope.complete(); throw }。
默认情况下,System.Transactions 基础结构创建可序列化事务。
【讨论】:
从 EF 6 开始,SQL Server 事务的默认隔离级别是 READ COMMITTED。参考在这里:Entity Framework Working with Transactions (EF6 Onwards)
对于其他提供者(相同参考)“事务的隔离级别是数据库提供者认为其默认设置的任何隔离级别”。因此,您必须查看该提供商的文档。
【讨论】: