【问题标题】:Update sort key of DynamoDB Item while ensuring consistency在确保一致性的同时更新 DynamoDB Item 的排序键
【发布时间】:2022-01-10 09:11:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: amazon-web-services transactions amazon-dynamodb


    【解决方案1】:

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

    每个项目都有一个版本计数器,一旦你更新它就会增加。当你想更新一个项目时,你首先读取它并存储当前的版本号。然后执行更新并增加版本号。现在您需要将其写回表中,这是您添加条件的时候。条件是该项目的当前版本需要与您最初阅读该项目时的版本相同。如果不是这种情况,则写入应该失败,因为同时其他人修改了该项目。

    应用于您的用例意味着:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多