concurrency - DynamoDB 自动更新计数器

标签 concurrency amazon-dynamodb atomic dynamodb-queries

这里是 DynamoDB 新手,有兴趣了解 NoSQL 数据库。

我有一个场景,其中有一个表,其中包含 userId 分区键、时间排序键和数字句柄。句柄是一个按 1 递增的顺序计数器。

以下是表格示例:

userId, time, handle
0     , 123 , 1
0     , 456 , 2
1     , 123 , 1
1     , 234 , 2
0     , 789 , 3
1     , 345 , 3

对于给定的 userId,句柄不能有重复

我想要做的是为 userId 0 添加一条新记录,时间为 891,并且句柄 1 大于 userId 0 的最后写入记录 - 这将是数据库中的倒数第二行,即, 3 + 1 = 4。

最简单的方法是在数据库中查询 userId 为 0 的情况,按最后的时间戳(如果可能的话)排序来获取句柄 (3)。这是第一个要求。然后,您可以在数据库上创建一个 put_item 请求,该请求将 1 添加到句柄 (3 + 1 = 4) 并创建一条新记录。

显然这里存在竞争条件,在读取查询和创建 put_item 请求之间,另一个 lambda/API/端点可能已使用相同的句柄 (4) 将新记录提交到数据库,例如(1、888、4)。当我提交原始记录 (0, 891, 4) 时,句柄是 4,而现在应该是 5。

是否可以在单个事务中执行此读写操作(也许我的思维方式错误)。

如果我的问题不清楚,请告诉我。

最佳答案

您可能需要第二个表来保存原子计数器,该计数器保存每个 userId 的最高句柄。当您需要添加记录时,您可以自动增加第二个表中 userId 的计数器,然后从计数器中获取值并将其用于新记录。

关于concurrency - DynamoDB 自动更新计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52399995/

相关文章:

c - `mmap()` 手动并发预故障/分页

multithreading - 托管语言和运行时的 future 保护

java - dynamoDB 中 putItemRequest 中预期的工作原理

java - 来自单线程执行器的 RejectedExecutionException

haskell - 我将如何使用每次传入都会重置的超时进行管道传输?

amazon-web-services - 分区容量限制与 DynamoDB 中表的总容量有何关系?

javascript - 如何替换列表中特定索引处的元素

REST API : How to ensure atomicity?

c - C 中的原子读取

ruby - ruby MRI 中的赋值是原子操作吗?