我遇到的情况是我在缓存数据库中表的内容。我正在使用Entity Framework 6对抗SQL Azure后端。当表中的数据更新时。过程看起来像这样:
然后在缓存服务上
数据服务上的代码按照以下方式工作 - 这显然是一个高度抽象的版本,但它显示了我们经历的步骤:
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似乎没有提供它们。
答案 0 :(得分:1)
在这种情况下,@ ivan-stoev正确地解释了此代码没有理由同步失败。这使我更详细地探索了缓存重建过程,并且依赖于在AutoMapper配置中隐藏的第二个缓存导致旧值在我的搜索中显示。
因此,对于遇到此问题的其他人来说,错误不在代码的这一部分。