更新 DynamoDB Item 的排序键,同时保证一致性

Update sort key of DynamoDB Item while ensuring consistency

我想将以下 DynamoDB 项目的排序键从 FILE#789 更新为 FILE#790。根据 DynamoDB 文档以及一些 Whosebug 答案,执行此操作的正确方法是删除现有项目 (DeleteItem) 并使用更新的主键重新创建它 (PutItem),执行 TransactWriteItems.

Item: {
  "PK": {
    "S": "USER#123"
  },
  "SK": {
    "S": "FILE#789"
  },
  "fileName": {
    "S": "Construction"
  }
}

DeleteItem 很简单,因为我知道复合主键的值。但是要重新创建项目,我需要项目属性的 最新 值,然后执行 PutItem。单独读取项目,然后在事务中执行 DeleteItemPutItem 并不能保证 most current 项目属性的值用于重新创建项目。在这种情况下处理项目主键更新的推荐方法是什么?

我会在这里使用乐观锁定的变体。如果您想了解详细信息,我已经 written a blog 讨论了这个概念,但这里是基本摘要:

Each item gets a version counter that's incremented once you update it. When you want to update an item, you first read it and store the current version number. Then you perform your update and increment the version number. Now you need to write it back to the table and this is when you add a condition. The condition is that the current version of the item needs to be the same as it was when you read the item originally. If that's not the case the write should fail, because somebody else modified the item in the mean time.

应用于您的用例意味着:

  1. 阅读项目并跟踪版本
  2. 使用新密钥和版本在本地更新项目
  3. 准备您的交易:
    1. DeleteItem 应该有条件地检查以确保版本号与 1)
    2. PutItem 可以无条件
  4. 您使用 TransactWrite 来存储数据

这样,如果原始项目在您更改时已更新,则交易将失败。如果失败,则重新从 1) 开始。