Durch die Nutzung von AWS re:Post stimmt du den AWS re:Post Nutzungsbedingungen

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
EXPERTE
gefragt vor einem Jahr72 Aufrufe
1 Antwort
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
EXPERTE
beantwortet vor einem Jahr

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen

Relevanter Inhalt