我正在尝试为dynamo db中的散列键实现auto -increment计数器,并且我的代码对并发事务失败。任何帮助实现该功能将不胜感激。我是新的堆栈流可能无法正确指定它。任何实施都会有所帮助。
提前致谢。
答案 0 :(得分:5)
您有两种选择,使用dynamo db原子计数器或在递增计数器时使用乐观锁定。
答案 1 :(得分:0)
您还可以使用条件写入来检查当前存储的计数器值与您要写入的值,例如检查当前计数是否为新值N的N-1。
我更喜欢这种方法,因为它推动了将计数器递增到您的应用程序的逻辑,但最终检查正确的持久性是使用DynamoDB。
答案 2 :(得分:0)
就像其他SOers正确指出的那样,您可以使用AtomicCounters或ConditionalUpdate。从2018年11月开始,您从DynamoDB获得了Transactions(免责声明:Havent亲自测试了事务,不确定是否适用于自动增量用例)
这是 AtomicCounter
上官方文档的引文您可以使用UpdateItem操作来实现 原子计数器-递增的数字属性, 无条件地,而不会干扰其他写入请求。 (所有 写入请求将按照接收到的顺序进行应用。) 使用原子计数器,更新不是幂等的。其他 字,每次调用UpdateItem时数值都会递增。
您可以使用原子计数器来追踪访问者的数量 网站。在这种情况下,您的应用程序将增加一个数字 值,而不考虑其当前值。如果是UpdateItem操作 失败,应用程序可以简单地重试该操作。这个会 会有两次更新计数器的风险,但您可能可以忍受 网站访问者的数量被高估或低估了。
交易
引入了两个新的DynamoDB操作以进行处理 交易:
TransactWriteItems,一个包含写入集的批处理操作,带有 一个或多个PutItem,UpdateItem和DeleteItem操作。 TransactWriteItems可以选择检查先决条件 进行更新之前必须满足的条件。这些情况可能 涉及与写入集中相同或不同的项目。如果 不满足任何条件,交易将被拒绝。
TransactGetItems,一个批处理操作,其中包含一个读取集,其中包含一个 或更多GetItem操作。如果在以下时间发出了TransactGetItems请求 作为活动写事务的一部分的项,读 交易被取消。为了获得先前的承诺价值,您可以 可以使用标准阅读。