【问题标题】:read uncommitted reads from cache?从缓存中读取未提交的读取?
【发布时间】:2014-09-05 06:34:15
【问题描述】:

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”。这是因为未提交读取吗?

【问题讨论】:

  • 您是否提交了type=2 更新?未提交会让您读取未提交的“2”,读取“1”指向其他问题。使用更高的 TransIsolation 应该会显示相同的结果。

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


【解决方案1】:

这与 read uncommited 无关。read uncommited 是一个隔离级别,指示如何处理事务中的锁。

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

如果您需要新鲜数据,则必须手动刷新。

如果你在谷歌上搜索“刷新实体框架缓存”,你会看到很多管理它的方法。由于您没有指定 EF 的版本和使用的技术(DbContext?ObjectContext?),我无法给出更具体的答案。

顺便说一下,要考虑到 DataContext 的寿命不会很长。如果您长时间继续使用相同的 DbContext,最终将占用大量内存来保存所有缓存的数据。大多数时候你应该使用新的 DbContexts。 (这也取决于应用程序的类型,例如,对于 ASP.NET 或 WPF 来说是不一样的)

【讨论】:

    【解决方案2】:

    你可以指定 MergeOption.OverwriteChanges;

    result.MergeOption = MergeOption.OverwriteChanges;
    

    或使用ObjectContext.Refresh

    disable the object tracking on the context

    【讨论】:

      【解决方案3】:

      我选择使用

      context.Entry(orders).Reload(); 
      

      重新加载实体

      Reload MSDN

      【讨论】:

        猜你喜欢
        • 2010-12-06
        • 2021-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多