当我发出“SaveChanges()”时,实体框架中的默认事务隔离级别是什么?我找不到任何地方。它应该是“Serializable”吗?
答案 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)
对于其他提供程序(相同的引用)“事务的隔离级别是数据库提供程序认为其默认设置的任何隔离级别”。因此,您必须查看该提供商的文档。