2014-09-05 67 views
-1

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”,临时被初始化到一行。如果我使用SSMS中的更新查询(MSSQL)将我的订单的orderType更新为“2”,则从上下文拉取的对象的订单类型仍然是“1”,尽管在DB中它的“2”。这是因为Read UnCommitted?

+0

你提交'type = 2'更新了吗?未提交会让你阅读一个未提交的'2',读一个'1'指向其他问题。使用更高的TransIsolation应显示相同的结果。 – 2014-09-05 08:14:40

回答

2

这有什么好做阅读uncommited.read未提交的是一个隔离级别,指示如何处理锁事务。

您的问题与EF的工作方式有关。 EF总是缓存数据,如果可用,请从缓存中获取。不管隔离级别是什么。

如果您需要新的数据,您必须手动刷新它。

如果你谷歌“刷新实体框架缓存”,你会看到很多方法来管理这个。由于您没有指定EF的版本以及所使用的技术(DbContext?ObjectContext?),所以我不能给出更具体的答案。

顺便说一句,考虑到DataContexts不会有很长的寿命。如果您长时间继续使用相同的DbContext,它将最终花费大量内存来保存所有缓存的数据。大部分时间你应该使用新鲜的DbContext。 (这alswo取决于那种应用程序,这不是他同为ASP.NET或WPF,例如)

+0

你好,谢谢!我使用重新加载方法 – Anirudh 2014-09-05 09:04:00