使用实体框架中的累积存储桶值

时间:2017-05-30 13:29:21

标签: database entity-framework design-patterns concurrency bucket

我试图找到在数据库中使用累积存储区值的设计模式/策略,其中并发可能是一个问题。我不知道用于查找有关该主题的信息的正确搜索词。

这是我的用例(我使用的是代码优先的实体框架,因此欢迎使用特定于EF的建议):

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

答案"您必须跟踪活动并从该活动中获取您的价值"是可以接受的,但我也想考虑所有以桶为中心的解决方案。

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

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

1 个答案:

答案 0 :(得分:1)

如果不直接编写更新存储桶的SQL查询,则必须使用客户端乐观并发。见Entity Framework Optimistic Concurrency Patterns。更新将覆盖更改的客户端将获得异常,之后您可以使用当前值重新加载并重试。此模式需要目标表上的ROWVERSION列。

如果您使用TSQL对更新进行编码,则可以对原子更新进行编码,例如

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

(< updlock'在此查询中并非严格必要,但只要您想确保这种隔离,这种格式就是好的)