EF中的“IsolationLevel.ReadUncommitted”是否从CACHE读取?
我有一个使用IsolationLevel.ReadUncommitted的交易范围
Class Orders{
public int Id {get();set();}
public int OrderType {get();set();}
}
While(true){
var transactionOptions = new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadUncommitted
};
using(TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
var temp = context.Orders.Include(e => e.Customer).SingleOrDefault(e => e.Id == 1);
}
}
假设,最初,我有一个订单类型为“1”的订单,temp初始化为该行。如果我使用SSMS(MSSQL)中的更新查询将我的订单的orderType更新为“2”,则从上下文中提取的对象的订单类型仍为“1”,尽管在DB中为“2”。这是因为Read UnCommitted?
答案 0 :(得分:2)
这与read uncommited无关.read uncommited是一个隔离级别,指示如何处理事务中的锁。
您的问题与EF的工作方式有关。 EF始终缓存数据,如果可用,则从缓存中获取数据。无论隔离级别如何。
如果您需要新数据,则必须手动刷新。
如果你google"刷新实体框架缓存"你会看到很多方法来管理它。由于您没有指定EF的版本和使用的技术(DbContext?ObjectContext?),我无法给出更具体的答案。
顺便说一下,考虑到DataContexts预计不会有很长的使用寿命。如果长时间继续使用相同的DbContext,最终会占用大量内存来保存所有缓存数据。你应该在大多数时候使用新的DbContexts。 (它也取决于应用程序的类型,例如,对于ASP.NET或WPF,它不一样)
答案 1 :(得分:0)
您可以指定MergeOption.OverwriteChanges;
result.MergeOption = MergeOption.OverwriteChanges;
答案 2 :(得分:0)