我将MVC应用程序托管为Azure Web角色,我还有Worker角色,用于检查数据库中的某些数据和更新记录。工作者角色每15分钟检查一次数据。
昨天,我遇到了大麻烦,因为通过MVC应用程序进行的很多更改都被恢复了。
我将尝试举例:
昨天用户对一个实体进行了更改(由事件日志跟踪)
与此同时,工作人员角色更新了该实体
今天,用户多次更新实体
最后,实体拥有昨天的数据,而不是今天的数据
MVC应用程序使用简单的SaveChanges函数,而worker角色使用带有SaveChanges的BeginTransaction。
我怀疑锁定和隔离级别,但锁定差不多24小时很奇怪。
我希望有人能理解这一点并帮助我。
由于
答案 0 :(得分:1)
如果您在工作者角色中保留持久性EF数据库上下文,则可能会看到正在缓存的EF对象的影响。
辅助角色加载实体并对其执行某些操作。由于您每次都没有创建和处理EF上下文,因此实体会保持缓存状态。
用户保存实体,数据库会随着更改而更新。
工作者角色再次查询该实体,但由于它被缓存,它将返回过时的缓存版本。它执行某种保存操作,用缓存的值覆盖用户的编辑。
请参阅Entity Framework and Connection Pooling,具体而言,
当您使用EF时,默认情况下,每个上下文仅加载一个实体。 第一个查询创建实体实例并在内部存储它。任何 后续查询需要具有相同键的实体返回此项 存储的实例。如果数据存储中的值发生了更改,则仍会收到 具有初始查询值的实体。
最重要的是,您永远不应该长时间持久保存EF数据库上下文。您可能会认为它只是一个开放的数据库连接,但它远不止于此而且"优化"保持它的东西是一种虚假的储蓄,会导致坏事发生。它意味着用于你创建它的UoW模式,做需要完成的操作,然后尽快处理它。