在DynamoDB中,原子计数器是一个避免竞争条件的数字
什么使数字成为原子,我可以在非单位值中添加/减去浮点数吗?
目前我在做:“SET balance = balance +:change”
(长版)我正在尝试使用DynamoDB进行用户余额,因此准确性至关重要。可以同时从多个来源更新余额。没有必要预先取得余额,我们永远不会拒绝交易,我只关心当所有操作完成后,我们将保持正确的平衡。只要最终结果正确,操作也可以按任何顺序应用。
根据我的理解,这应该没问题,但我没有看到任何原子增量示例更改“1”以外的值
我犹豫不决是因为像Amazon DynamoDB Conditional Writes and Atomic Counters这样的问题建议对类似的情况使用条件式写法,这听起来像是一个糟糕的主意。如果我获取平衡,更改并执行条件写入,则在此期间值已更改时写入可能会失败。但是,平衡是业务关键的定义,忽略文档时我总是很紧张
- 附加信息 -
所有写入都来自Lambda函数,我期望写入成功率几乎达到100%。但是,我还保留所有更改的历史记录,如果余额处于“未知”状态(例如网络超时),则可以锁定表格并从历史记录中重新计算正确的余额。
我认为这是最好的“正常”操作。 99.999%的时间,所有更新都可以使用一次写入。失败可能是非常昂贵的,因为我们需要扫描客户的整个历史来重新创建平衡,但在权衡方面似乎是一个相当安全的赌注。
答案 0 :(得分:2)
原子计数器的文档很清楚,在我看来,对你的用例来说是不安全的。
您正在解决的问题很常见,AWS建议在这种情况下使用乐观锁定。 请参阅以下AWS文档, http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html
答案 1 :(得分:1)
从AWS员工的回复
看来,这个概念是可行的应用程序编写者通常会使用这两种方法的组合, 你可以在哪里有一个用于实时计数的原子计数器,以及一个 审计表以便以后完善会计。
https://forums.aws.amazon.com/thread.jspa?messageID=470243񲳣
还确认更新将是原子的,任何更新操作都是一致的
您发送到DynamoDB的所有非批处理请求都会以原子方式处理 - 请求之间没有涉及任何类型的交错。写请求也是一致的,因此任何写请求都将更新 收到请求时项目的最新版本。
https://forums.aws.amazon.com/thread.jspa?messageID=621994򗶪
事实上,对给定项目的每次写入都是非常一致的
在DynamoDB中,针对给定项目的所有操作都被序列化。
https://forums.aws.amazon.com/thread.jspa?messageID=324353񏌁