这里是 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/endpoint 可能已经使用相同的句柄 (4) 向数据库提交了一条新记录,例如 (1, 888, 4) . 当我提交原始记录 (0, 891, 4) 时,句柄是 4,而现在应该是 5。
是否可以在单个事务中执行此读写操作(也许我的心态错误)。
如果我的问题不清楚,请告诉我。