这里是 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/