从缓存读取未提交的读取?

时间:2014-09-05 06:34:16

标签: c# .net sql-server linq entity-framework

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?

3 个答案:

答案 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;

或使用ObjectContext.Refresh

disable the object tracking on the context

答案 2 :(得分:0)

我选择使用

context.Entry(orders).Reload(); 

重新加载实体

Reload MSDN