我正在尝试更新我的简单数据库中的计数器(一个键,一个数值)。 Atomic counters似乎是天生的解决方案,但我需要线程安全更新,即我需要确保更新不会相互干扰。
This answer似乎暗示我需要在执行实际写入之前仔细检查数据是否未被其他更新修改过。
我的问题是,如何在ConditionExpression
中引用数据库中的当前值?
假设table
是dynamodb.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"
)
答案 0 :(得分:2)
如果您只是想使用原子计数器,那么您就不需要条件。您链接的答案只是引用在一些非常重要的情况下说明的文档(您也链接了),例如增加银行帐户余额,如果您不完全确定,则需要使用条件表达式第一次尝试增加成功。例如,如果您在从DynamoDB获得响应之前尝试增加值并丢失网络连接。在这种情况下,您无法确定它是否成功,并且需要重试条件。
您声明您只需要线程安全更新,原子计数器在不使用条件表达式的情况下提供。