如何使用 javascript aws-sdk 支持 dynamoDB 中的事务?

How to support transactions in dynamoDB with javascript aws-sdk?

我们有一个用 node.js 编写的微服务,我们使用 dynamoDB 进行数据存储。值以 json 格式针对键存储。在更新服务调用中,我们获取一个键的值,更新 json 并保存它。

最近,我们遇到了 2 个调用想要更新同一个键的值的情况。所以第一次调用读取值,然后第二次调用读取值,第一次调用更新并保存,然后第二次更新并保存值(竞争条件的通常情况),所以在这种情况下,第一次调用的更新没有反映在数据库中。

为了解决这个问题,我研究了一下并了解了 dynamoDB 的事务库。但是好像还没有在node-js sdk中。

此外,我搜索了关于版本控制和乐观锁定的信息,但我再次没有在 node-js sdk 中找到对此的支持。

这个有更新吗?如果它的支持不会在不久的将来出现在 node-js sdk 中,那么其他选择是什么?处理此问题的最佳方法是什么?

  1. 您可以进行原子更新,例如直接在 Dynamo 上递增数字,而无需读取、递增和更新。有关详细信息,请参阅 this

  2. 两次更新是否更新同一个字段?如果是这样,您可以向更新添加一个条件,即旧值等于您读取的值。这样,如果您尝试保存第二个新值,则此条件将失败并且不会执行第二次更新。参见 this

最近有一个 npm 包提供了 DynamoDb 乐观锁定的实现。参见 Dynameh。你可以看看。

2018 年刚刚发布 re:invent,请在此处查看 javascript sdk 用法中的本机事务支持:https://aws.amazon.com/blogs/aws/new-amazon-dynamodb-transactions/