【发布时间】:2016-05-17 21:24:10
【问题描述】:
在 DynamoDB 中,原子计数器是避免竞争条件的数字
什么使数字具有原子性,我可以在非单位值中添加/减去浮点数吗?
目前我正在做:“SET balance = balance + :change”
(长版)我正在尝试将 DynamoDB 用于用户余额,因此准确性至关重要。余额可以同时从多个来源更新。不需要预取余额,我们永远不会拒绝交易,我只关心当所有操作完成后,我们会留下正确的余额。只要最终结果正确,这些操作也可以按任何顺序应用。
据我了解,这应该没问题,但我没有看到任何原子增量示例会更改“1”以外的值
之所以犹豫,是因为像Amazon DynamoDB Conditional Writes and Atomic Counters 这样的问题建议在类似情况下使用条件写入,这听起来是个糟糕的主意。如果我获取余额、更改并进行有条件的写入,如果值在此期间发生更改,则写入可能会失败。然而,平衡是业务关键的定义,忽略文档时我总是很紧张
-附加信息-
所有写入都来自 Lambda 函数,我预计写入的成功率几乎是 100%。但是,我还保留了所有更改的历史记录,如果余额处于“未知”状态(例如网络超时),可以锁定表并从历史记录中重新计算正确的余额。
我认为这是最好的“正常”操作。 99.999% 的情况下,所有更新都将通过一次写入进行。失败的代价可能非常高昂,因为我们需要扫描客户的整个历史来重新创建平衡,但就权衡而言,这似乎是一个相当安全的选择。
【问题讨论】:
标签: amazon-dynamodb