如何使用Spring Boot在DynamoDB中添加带有自动递增键的新项



我想使DynamoDB中的主键成为像SQL一样的AutoIncrement key。生成后,如果顺序中有丢失的项目,(删除某些项目后(

+--------+---------------+
|   id   |      name     |
+--------+---------------+
|    1   |  AuctionStart |    
+--------+---------------+
|    2   |   AuctionEnd  |
+--------+---------------+
|    5   |      Bid      |
+--------+---------------+
|    7   |     OutBid    |
+--------+---------------+

在这种情况下,我想插入带有3、4、6,然后是8、9、10。。。如何使用Spring Boot+DynamoDB进行此操作?

DynamoDB没有自动增量,但以下两个功能应该可以帮助您使用以下DynamoDB功能实现您想要的功能:

  • DynamoDB支持多个表可以同时原子更新的事务
  • DynamoDB还支持条件表达式,这将确保我们可以根据条件停止更新

下面是一个简单的想法,它使用了的上述功能


让我们调用您的表DATA
您可以维护另一个COUNTER表,该表存储丢失的键和迄今为止分配的highestId(类似于下面的值为Document类型(

Key        Value                                                RecordVersionNumber
+-------------+-----------------------------------------------------+--------+
| Counter     |   {"Highestid": 7, "MissingKeys": ["3,4,6"]}        |  10    |
+-------------+-----------------------------------------------------+--------+

如果DELETE从数据表中删除,它将向缺失的Keys添加一个IDINSERT可以选择一个丢失的键,在这种情况下,它会从丢失的键中删除元素如果missingKeys为空,INSERT将编辑HighestId而不是

  • 检查DynamoDB列的大小限制,并根据您的数据设计相应的表
  • 计数器不需要是一个特定的表,您甚至可以使用DATA表中的一行。我用了一个单独的表格来澄清
  • 查看事务隔离级别

对于您的自动增量版本,以下步骤应在每次操作过程中原子发生:

删除期间:

  1. 写入数据表:使用条件删除删除具有给定id的记录
  2. 从COUNTER表读取:读取现有丢失的密钥
  3. 写入COUNTER表:将删除的Id添加到missingKeys,对列表进行排序,将RecordVersionNumber增加1,并对RecordVersionNumber执行条件更新

读取(2(是在java代码中完成的,写入是作为TransactWriteItem语句准备的
如果(1(因为键不存在而失败,则其他步骤将不会发生
在(3(中,为了避免并行调用损坏我们的数据,我们必须添加一个条件检查,以确保只有当现有记录的RecordVersionNumber与我们在(2(中读取的RecordVersionNumber相同时才写入

即(3(如果我们在(2(中读取计数器后,任何其他INSERT/DELETE操作编辑了计数器,则(3(将以ConditionalCheckFailed异常失败

ConditionalCheckFailed操作需要处理,整个方法:(1(、(2(、(3(应该在返回失败响应之前重试几次


插入期间:

  1. 从COUNTER表读取:读取现有丢失的键,HighestId
  2. 写入数据表:为新的";Id名称";记录如果missingKeys为空,则id=HighestId+1 else id=missingKeys.first
  3. 写入COUNTER表:根据步骤(2(中所做的操作,删除分配的missingKeys值或增加highestId,通过RecordVersionNumber的条件更新写回记录

如果两个INSERT调用并行发生,两个调用都可能读取相同的COUNTER数据,并尝试将冲突的id写入data表。在这种情况下,由于ConditionalCheckFailed错误,其中一个插入将在(2(处失败,并且应该重试步骤(1到3(

如果COUNTER表在我们读取(1(中丢失的密钥后由于DELETE而被修改,那么步骤(3(将失败,并且整个(1-3(应该在代码中重试


如果您能够对INSERT/DELETE操作的数量进行排队或控制并行执行的数量,则应减少由于并行调用而导致的重试次数

最新更新