如何在dynamoDB中实现50次写入的事务



我知道每笔交易有25项的硬性限制。然而,我相信有一种方法可以从头开始实现更多项目的事务。我该怎么做?

我在想,在每件商品上都留一个版本号。提前获取所有项目,在插入期间验证版本号是否相同。即乐观锁定。如果条件失败,请还原所有失败的项目。当然,我可以想象恢复可能会失败,我需要对恢复进行乐观锁定,最终导致恢复死锁。

我最终找到的解决方案是实现悲观锁定。它支持任意数量的写入和读取,并保证事务一致性。问题是,如果你不小心,很容易陷入死锁。

这个想法是你

  1. 创建一个锁表。每一行都指向一个特定的锁。锁表的主键应该是一个字符串,我将其称为锁键。通常你会想锁定一个特定的实体,所以这是锁定键{table_name}#{primary_key}的合理格式,但它可能更随意,所以任何字符串都可以。锁定表中的行也应该在一段时间后根据ttl字段(即TimeToLiveSpecification(自动删除
  2. 在启动事务之前,请获取锁。要做到这一点,您可以使用任意锁定键创建行,并有条件地检查该行是否已经存在。如果它确实存在,那么行创建应该会失败,这意味着另一个进程已经获取了锁。然后,您需要轮询,尝试重新创建锁行,直到释放锁为止
  3. 一旦您获得了锁,您需要通过心跳保持锁的活动状态,以防止其他任务执行。hearbeat进程应该增加锁行上的heartbeat属性,该属性反映锁的最后活动时间。该行的ttl应大于检测信号间隔。通常是双倍,这样锁就不会被错误地自动清除。如果进程失效,则ttl的自动删除将自然释放锁
  4. 如果您的任务成功完成,它应该删除锁定行,从而为其他任务腾出空间

最新更新