两个或多个读之间的EF一致性



在微软关于EF的文档中,这一页是按字面意义来说明的

实体框架没有在事务中封装查询

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

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

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

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

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

最新更新