【问题标题】:DynamoDb safe updateDynamoDb 安全更新
【发布时间】:2016-02-01 23:43:17
【问题描述】:

我正在尝试更新我的简单数据库中的计数器(一个键,一个数值)。 Atomic counters 似乎是自然的解决方案,但我需要线程安全更新,即我需要确保更新不会相互干扰。

This answer 似乎暗示我需要在执行实际写入之前仔细检查数据是否被另一个更新修改。

我的问题是,如何在ConditionExpression 中引用数据库中的当前值? 假设tabledynamodb.Table 对象(Python API),这是我为update_item 编写的代码:

table.update_item(
            Key={
                'key': my_key
            },
            UpdateExpression="set my_value = my_value + :inc",

            ConditionExpression="my_value = ?????" # should be value in the db now
            ExpressionAttributeValues={
                ':inc': my_increment,
            },
            ReturnValues="UPDATED_NEW"
        )

【问题讨论】:

    标签: python amazon-web-services amazon-dynamodb database-concurrency distributed-database


    【解决方案1】:

    如果您只想使用原子计数器,则不需要条件。您链接的那个答案只是引用了在一些极其重要的情况下(例如增加银行账户余额)的文档(您也链接了该文档),如果您不完全确定第一次尝试,您将需要使用条件表达式递增成功。例如,如果您在收到 DynamoDB 的响应之前尝试增加值并丢失了网络连接。在这种情况下,您将无法确定它是否成功并且需要使用条件重试。

    您声明您只需要线程安全更新,原子计数器在不使用条件表达式的情况下提供这些更新。

    【讨论】:

    • 谢谢,这大大简化了我的生活。假设我还想确保更新成功,我该怎么做?我可以在写入后再次检查,但那时其他人可能已经更改了元素
    • 只要你得到一个成功的响应,那么你就知道它成功了。如果它抛出一个错误,那么你知道有一个错误。如果您失去网络连接或您的应用程序崩溃或类似的情况,您只会不确定它。
    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多