使用 Entity Framework 中的累积存储桶值

Working with accumulated bucket values in Entity Framework

我正在尝试寻找设计 patterns/strategies 来处理并发性可能成为问题的数据库中的累积存储桶值。我不知道用于查找有关该主题的信息的正确搜索词。

这是我的用例(我使用的是代码优先 Entity Framework,因此欢迎提供特定于 EF 的建议):

我有一个包含数量值的数据库 table。这个数量值可以被多个客户端同时递增或递减(因此,我称这个值为 "bucket" 值,因为它是一堆累积的 activity 的桶;这是在另一种策略的反对,你保留所有 activity 并根据 activity 计算值)。我正在寻找确保此 "bucket" 值(在 EF 上下文中)准确性的策略,考虑到多个客户端可能会尝试同时更改它(并发)。

答案"you must track activity and derive your value from that activity"是接受table,但我也想考虑所有以桶为中心的解决方案。

我正在寻找有关搜索词的建议,用于查找有关此主题的有用信息以及特定链接。

编辑:您可以假设所有 activity 都是相对于 "bucket" 值的(没有客户端会对值进行绝对更改;它们只会递增或递减)。

如果不直接对更新存储桶的 SQL 查询进行编码,您将不得不使用客户端乐观并发。请参阅目标 table 上的 Entity Framework Optimistic Concurrency Patterns. Clients whose update would overwrite a change will get an exception, after which you can reload with the current value and retry. This pattern requires a ROWVERSION 列。

如果您在 TSQL 中编写更新代码,您可以编写原子更新代码,例如

update foo with (updlock)
set bucket_a = bucket_a + 1 
output inserted.*
where id = @id

('updlock' 在此查询中不是绝对必要的,但在您想要确保这种隔离的任何时候都是很好的形式)