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
专家
已提问 6 个月前29 查看次数
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
专家
已回答 6 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则