实体框架的默认读锁是什么,以及如何实现可重复读锁。
我想也许某个地方可能存在全局设置,因此默认情况下会获取类型可重复读取的读锁定,然后在保存更改启动后释放。
What is the default transaction isolation level in Entity Framework when I issue “SaveChanges()”?。这里假设默认隔离级别是快照。如何更改为可重复读取。
答案 0 :(得分:0)
Msdn告诉默认隔离模式与数据库有关。
它还提供了一个如何处理事务的示例,这是您需要从隔离模式repeatable read
中获益的方法。要注意,他们的例子有一个非常讨厌的缺陷,因为它会吞下任何异常。
以下是他们示例的固定版本。 context
应该是从DBContext
派生的类的实例。
using (var dbContextTransaction =
context.Database.BeginTransaction(
System.Data.IsolationLevel.RepeatableRead))
{
try
{
// Your work here, then
context.SaveChanges();
dbContextTransaction.Commit();
}
catch
{
dbContextTransaction.Rollback();
throw;
}
}
正如Panagiotis Kanavos所警告的那样,应尽可能避免这种锁定。它会降低可扩展性,增加死锁风险,只要事务正在运行,就可能完全阻止其他用户......
try catch rollback
可能被认为是多余的,因为处理正在进行的System.Data.SqlClient.SqlTransaction
会导致它回滚(而using
将确保它被处置掉)。但由于具体事务可能属于其他类型,具体取决于使用的数据存储,因此在发生故障时显式回滚更安全。