DynamoDb 安全更新



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

这个答案似乎表明,在执行实际写入之前,我需要仔细检查数据是否未被另一个更新修改。

我的问题是,如何在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"
        )

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

声明您只需要线程安全更新,原子计数器无需使用条件表达式即可提供这些更新。

相关内容

  • 没有找到相关文章

最新更新