首页 > 解决方案 > 两个或多个读取之间的 EF 一致性

问题描述

在Microsoft 关于 EF 的文档中的页面中,字面意思是

实体框架不会在事务中包装查询

如果我是对的,这意味着 sql 读取并不包含在事务中,因此我们代码中的每个选择都是独立执行的。但是如果是这样的话,我们能保证两次读取彼此之间是一致的吗?在典型情况下,如果 A 和 B 之间的传输在读取之间开始(在不同的连接中),是否有保证 A 的加载量和 B 的加载量的总和将是正确的(在某些连接中) A的读音和B的读音?Entity Framework 能否以某种方式解决这种情况?

标签: entity-frameworktransactions

解决方案


EF 中的内置解决方案是客户端乐观并发。更新时,EF 将构建一个查询,以确保要更新的行在读取后没有更改。

配置为并发令牌的属性用于实现乐观并发控制:每当在 SaveChanges 期间执行更新或删除操作时,数据库上的并发令牌的值都会与 EF Core 读取的原始值进行比较。

如果值匹配,则操作可以完成。如果值不匹配,EF Core 会假定另一个用户执行了冲突操作并中止当前事务。

您还可以选择任何隔离级别的事务,这可能会提供类似的保护。或者对目标数据库使用带有锁定提示的原始 SQL查询。


推荐阅读