AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

DynamoDB UpdateItem

0

【以下的问题经过翻译处理】 如果两个(或更多)客户端同时尝试更新同一项目,并且每个客户端更新项目中的不同属性,例如,客户端一尝试使用更新 id=1 的项目并设置属性 a1=10,而客户端二尝试更新相同的项目,但属性 a2=10,会发生什么?

一个更改会覆盖另一个吗?会出现错误吗?两个都会被接受吗?

如果在发送两个请求时该项目不存在会怎样?如果该项目存在但更新的属性不存在会怎样?有什么区别吗?

为了澄清用例:我有一个数据源,看起来像这样:ID,Key,Value。

例如:

  • 1,a1,10
  • 1,a2,20
  • 2,a5,30
  • 1,a4,15

等等。

可以看出,有多条具有相同ID的记录。我希望将其添加到DynamoDB中的方式是,分区键为ID,属性为Keys。在上面的示例中,我需要在DDB中有两个项目,看起来像:

  • ID:1,a1:10,a2:20,a4:15
  • ID:2,a5:30

我想同时处理这些记录,所以我想验证如果两个客户端/线程同时尝试修改相同的项目会发生什么。例如,如果我在DDB中有一个ID:1和A1:10的项目,并且我有两个线程,一个尝试将a2设置为20,一个尝试将a4设置为15,而不先读取该项目。会出现其中一个更新丢失的情况吗?

profile picture
エキスパート
質問済み 1年前72ビュー
1回答
0

【以下的回答经过翻译处理】 您可以对项目进行更新,并仅设置一个属性的值。 Client1可以设置a1=10,Client2可以设置a2=10,这没有问题。

# aws dynamodb put-item --table-name test --item '{"pk": { "S": "1" }}'

# aws dynamodb get-item --table-name test --key '{"pk": { "S": "1" }}'
{
    "Item": {
        "pk": {
            "S": "1"
        }
    }
}

# aws dynamodb update-item --table-name test --key '{"pk": { "S": "1" }}' --update-expression "SET a1 = :a1" --expression-attribute-values '{":a1" : {"N":"10"}}' --return-values ALL_NEW
{
    "Attributes": {
        "a1": {
            "N": "10"
        },
        "pk": {
            "S": "1"
        }
    }
}

# aws dynamodb update-item --table-name test --key '{"pk": { "S": "1" }}' --update-expression "SET a2 = :a2" --expression-attribute-values '{":a2" : {"N":"10"}}' --return-values ALL_NEW
{
    "Attributes": {
        "a1": {
            "N": "10"
        },
        "pk": {
            "S": "1"
        },
        "a2": {
            "N": "10"
        }
    }
}

profile picture
エキスパート
回答済み 1年前

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン

関連するコンテンツ