首页 > 解决方案 > 多个请求更新 DynamoDB 中的相同属性

问题描述

我目前使用 Dynamodb 作为数据库和 NodeJS 作为后端。对于每个用户,每当我收到请求时,我都会从数据库中获取该用户的数据,在后端对数据进行一些计算,然后在请求结束时更新数据库中的数据。

问题在于,当单个用户同时发出多个请求时,只有一些更新会写入数据库,而其他更新会丢失。有什么办法可以解决这个问题。

例如,假设我为每个用户都有一个计数器,并且在每个请求中我都提供一个值,计数器将使用该值递增。因此,如果我同时发送 5 个值为 5 的请求,那么计数器应该增加 25,但它只增加 10 或 15

如果可以解决这个问题,我不介意将数据库更改为 mongodb

标签: javascriptdatabaseamazon-web-servicesconcurrencyamazon-dynamodb

解决方案


DynamoDB 建议您为此使用乐观锁定:

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html

使用乐观锁定,每个项目都有一个作为版本号的属性。如果您从表中检索项目,应用程序会记录该项目的版本号。您可以更新项目,但前提是服务器端的版本号未更改。如果版本不匹配,则表示其他人在您之前修改了该项目。更新尝试失败,因为您拥有该项目的旧版本。如果发生这种情况,您只需通过检索该项目然后尝试更新它来重试。乐观锁定可防止您意外覆盖他人所做的更改。它还可以防止其他人意外覆盖您的更改。

基本思想是:

  • 每条记录都有一个版本号
  • 当您阅读并编辑记录时,您会增加版本号
  • UpdateItemorPutItem调用中,您添加一个条件,即只有在版本号仍然具有与您读取记录时相同的值时,这才应该成功。

如果是关于递增计数器,您可以ADD在 UpdateItem 调用中使用运算符来执行此操作,然后 DynamoDB 将处理并发问题。

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html


推荐阅读