如何在 dynamoDB 中实现 50 次写入的事务?
How can I implement a transaction of 50 writes in dynamoDB?
我知道每笔交易有 25 件商品的硬性限制。但是,我确信有一种方法可以从头开始为更多项目实现交易。我该怎么做?
我在想,在每个项目上保留一个版本号。预先获取所有项目,在插入期间验证版本号是否相同。即乐观锁定。如果条件失败,则还原所有失败的项目。当然,我可以想象还原可能会失败,我需要对还原进行乐观锁定并最终陷入还原死锁。
最后找到的解决方案是实现悲观锁。它支持任意数量的写入和读取,并保证事务的一致性。问题是,如果您不小心,很容易 运行 陷入僵局。
这个想法是你
- 创建一个锁table。每行都引用一个特定的锁。锁 table 的主键应该是一个字符串,我将其称为 lock-key。通常你会想要锁定一个特定的实体,所以这是 lock-key
{table_name}#{primary_key}
的合理格式,但它可能更随意,所以任何字符串都可以。锁 table 中的行也应该 auto-delete 根据 ttl 字段在特定时间段后即 TimeToLiveSpecification
.
- 在开始事务之前,获取锁。您可以通过使用任意 lock-key 和 conditional check 来创建该行,该行尚不存在。如果它确实存在,行创建应该失败,这意味着另一个进程已经获得了锁。然后您需要进行轮询,尝试重新创建锁定行,直到锁定被释放。
- 获得锁后,您需要通过心跳使锁保持活动状态,以防止执行其他任务。心跳进程应该在锁行上增加一个心跳 属性,它反映了锁的 last-active 时间。该行的 ttl 应大于心跳间隔。一般是double左右,这样锁就不会auto-purged错了。如果你的进程挂掉了,锁会被ttl的auto-deletion自然释放。
- 如果您的任务成功完成,它应该删除锁定行以释放它用于其他任务。
我知道每笔交易有 25 件商品的硬性限制。但是,我确信有一种方法可以从头开始为更多项目实现交易。我该怎么做?
我在想,在每个项目上保留一个版本号。预先获取所有项目,在插入期间验证版本号是否相同。即乐观锁定。如果条件失败,则还原所有失败的项目。当然,我可以想象还原可能会失败,我需要对还原进行乐观锁定并最终陷入还原死锁。
最后找到的解决方案是实现悲观锁。它支持任意数量的写入和读取,并保证事务的一致性。问题是,如果您不小心,很容易 运行 陷入僵局。
这个想法是你
- 创建一个锁table。每行都引用一个特定的锁。锁 table 的主键应该是一个字符串,我将其称为 lock-key。通常你会想要锁定一个特定的实体,所以这是 lock-key
{table_name}#{primary_key}
的合理格式,但它可能更随意,所以任何字符串都可以。锁 table 中的行也应该 auto-delete 根据 ttl 字段在特定时间段后即TimeToLiveSpecification
. - 在开始事务之前,获取锁。您可以通过使用任意 lock-key 和 conditional check 来创建该行,该行尚不存在。如果它确实存在,行创建应该失败,这意味着另一个进程已经获得了锁。然后您需要进行轮询,尝试重新创建锁定行,直到锁定被释放。
- 获得锁后,您需要通过心跳使锁保持活动状态,以防止执行其他任务。心跳进程应该在锁行上增加一个心跳 属性,它反映了锁的 last-active 时间。该行的 ttl 应大于心跳间隔。一般是double左右,这样锁就不会auto-purged错了。如果你的进程挂掉了,锁会被ttl的auto-deletion自然释放。
- 如果您的任务成功完成,它应该删除锁定行以释放它用于其他任务。