我正在尝试更新我的简单数据库中的计数器(一个键,一个数值)。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"
)
如果您只想使用原子计数器,则不需要条件。您链接的答案只是引用文档(您也链接了该文档),该文档声明在某些极其重要的情况下,例如增加银行帐户余额,如果您不完全确定第一次尝试增量是否成功,您将希望使用条件表达式。例如,如果您试图增加该值,但在收到DynamoDB的响应之前就失去了网络连接。在这种情况下,您不确定它是否成功,需要使用条件重试。在
您声明只需要线程安全更新,原子计数器提供这些更新而不使用条件表达式。在
相关问题 更多 >
编程相关推荐