【问题标题】:Working with accumulated bucket values in Entity Framework在实体框架中使用累积的存储桶值
【发布时间】:2017-05-30 13:29:21
【问题描述】:

我正在尝试找到设计模式/策略,以便在并发可能成为问题的数据库中处理累积的存储桶值。我不知道用于查找有关该主题的信息的正确搜索词。

这是我的用例(我使用的是代码优先实体框架,因此欢迎针对 EF 提出建议):

我有一个包含数量值的数据库表。这个数量值可以由多个客户端同时增加或减少(因此,我将此值称为“桶”值,因为它是一堆累积活动的桶;这与其他策略相反,其中您保留所有活动并根据活动计算值)。我正在寻找确保这个“桶”值(在 EF 的上下文中)准确性的策略,考虑到多个客户端可能会尝试同时更改它(并发)。

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

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

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

【问题讨论】:

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


    【解决方案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' 不是绝对必要的,但在您想要确保这种隔离的任何时候都是很好的形式)

    【讨论】:

    猜你喜欢
    • 2014-01-25
    • 1970-01-01
    • 2012-09-29
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多