javascript - 多个请求更新 DynamoDB 中的相同属性
问题描述
我目前使用 Dynamodb 作为数据库和 NodeJS 作为后端。对于每个用户,每当我收到请求时,我都会从数据库中获取该用户的数据,在后端对数据进行一些计算,然后在请求结束时更新数据库中的数据。
问题在于,当单个用户同时发出多个请求时,只有一些更新会写入数据库,而其他更新会丢失。有什么办法可以解决这个问题。
例如,假设我为每个用户都有一个计数器,并且在每个请求中我都提供一个值,计数器将使用该值递增。因此,如果我同时发送 5 个值为 5 的请求,那么计数器应该增加 25,但它只增加 10 或 15
如果可以解决这个问题,我不介意将数据库更改为 mongodb
解决方案
DynamoDB 建议您为此使用乐观锁定:
使用乐观锁定,每个项目都有一个作为版本号的属性。如果您从表中检索项目,应用程序会记录该项目的版本号。您可以更新项目,但前提是服务器端的版本号未更改。如果版本不匹配,则表示其他人在您之前修改了该项目。更新尝试失败,因为您拥有该项目的旧版本。如果发生这种情况,您只需通过检索该项目然后尝试更新它来重试。乐观锁定可防止您意外覆盖他人所做的更改。它还可以防止其他人意外覆盖您的更改。
基本思想是:
- 每条记录都有一个版本号
- 当您阅读并编辑记录时,您会增加版本号
- 在
UpdateItem
orPutItem
调用中,您添加一个条件,即只有在版本号仍然具有与您读取记录时相同的值时,这才应该成功。
如果是关于递增计数器,您可以ADD
在 UpdateItem 调用中使用运算符来执行此操作,然后 DynamoDB 将处理并发问题。
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html
推荐阅读
- symfony - 如何将 __toString 方法用于选择类型字段
- javascript - Angular 6过滤多个表列
- concurrency - 在 Erlang 中传递的消息不会打印到控制台
- c# - 如何将域上下文绑定到数据网格?Ria 服务 + Silverlight
- powershell - 尝试基于百分比实现 if 语句
- excel - 使用带有 excel 宏的文本文件创建 csv 文件
- python - 具有最小范围但更改限制的 pyplot 轴
- node.js - 无服务器 AWS Lamba 功能上的预检 CORS 问题。
- python - Python 5 周存储桶
- python - 找不到管理页面