确保在使用Entity Framework和C#返回之前已更新数据库

时间:2017-06-05 11:00:29

标签: c# entity-framework race-condition

我遇到的情况是我在缓存数据库中表的内容。我正在使用Entity Framework 6对抗SQL Azure后端。当表中的数据更新时。过程看起来像这样:

  • 从UI接收数据
  • 根据商店的当前状态插入/更新
  • 触发缓存重建(在单独的服务上)

然后在缓存服务上

  • 清除缓存
  • 从表中加载所有实体
  • 将集合添加到缓存

数据服务上的代码按照以下方式工作 - 这显然是一个高度抽象的版本,但它显示了我们经历的步骤:

public void UpdateProperty( int newVal ) 
{
    SetNewPropertyVal(newVal);
    TriggerUpdateEvent( newVal );
}

private void SetNewPropertyVal(int newVal) 
{

     using (var context = new MyContext()) 
     {
         using ( var mySet = context.Set<MyEntityType>();
         {
              var record = mySet.FindRecordToUpdate();
              record.UpdateableFieldValue = newVal;
              context.SaveChanges();
         }   
     }
}

问题在于虽然在引发context.SaveChanges()之前调用了TriggerUpdateEvent,但是当缓存重建时(在单独的,完全独立的线程中运行,针对DbContext的单独实例) )检索实体集合,它包含更新属性的旧值。这看起来像一个竞争条件 - 如果我在缓存刷新中放置一个简单的Thread.Sleep(1000)它会一直工作,但我不相信这是解决这个问题的好方法。

在实体框架实际更新数据存储之前,如何避免触发缓存重建?我认为一个事务可能会成功,但SQL Azure似乎没有提供它们。

1 个答案:

答案 0 :(得分:1)

在这种情况下,@ ivan-stoev正确地解释了此代码没有理由同步失败。这使我更详细地探索了缓存重建过程,并且依赖于在AutoMapper配置中隐藏的第二个缓存导致旧值在我的搜索中显示。

因此,对于遇到此问题的其他人来说,错误不在代码的这一部分。