Concurrency 动态原子更新计数器

Concurrency 动态原子更新计数器,concurrency,amazon-dynamodb,atomicity,dynamodb-queries,Concurrency,Amazon Dynamodb,Atomicity,Dynamodb Queries,DynamoDB新手,对学习NoSQL数据库感兴趣 我有一个场景,其中我有一个表,它有一个userId分区键、一个time排序键和一个数字句柄。句柄是按1递增的顺序计数器 以下是该表的一个示例: userId, time, handle 0 , 123 , 1 0 , 456 , 2 1 , 123 , 1 1 , 234 , 2 0 , 789 , 3 1 , 345 , 3 对于给定的userId,句柄不能有重复项 我希望能够为userId

DynamoDB新手,对学习NoSQL数据库感兴趣

我有一个场景,其中我有一个表,它有一个userId分区键、一个time排序键和一个数字句柄。句柄是按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_项请求,该请求将1添加到句柄(3+1=4)并创建一个新记录

显然,这里有一个竞争条件,在读取查询和创建put_项请求之间,另一个lambda/API/endpoint可能已经使用相同的句柄(4)向数据库提交了一条新记录,例如(1888,4)。当我提交原始记录(0891,4)时,句柄是4,而现在应该是5

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


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

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

您试图做的是:“将单调递增的数值指定为唯一标识符”是分布式数据库(noSql或其他)的反模式

请花一点时间考虑这个问题。

如果可以使用GUID作为唯一标识符,则不再需要查询以确定上次使用的标识符,并且始终保证具有唯一值

如果你需要IDS有一些顺序的概念,那么你应该考虑一个策略,从时间戳加上一些小的随机值来生成IDS。如果试图插入具有重复标识符的记录,请重试

否则,使用任意单调递增整数的方法是将这些整数存储在用户级别(相同的表或单独的表),但每次更新用户记录时,都会更新相同的键,因此失去了可伸缩性

最后——如果对于每个用户,只有一个非常小的记录要存储,那么考虑一个模式,将这些元素组合成单个项。