DynamoDb 安全更新

DynamoDb safe update

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

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

我的问题是,如何在 ConditionExpression 中引用数据库中的当前值? 假设tabledynamodb.Table对象(PythonAPI),这是我为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 的响应之前尝试增加该值并丢失网络连接。在那种情况下,您将不确定它是否成功并且需要在有条件的情况下重试。

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