DynamoDB updateItem

0

【以下的问题经过翻译处理】 我在想如果很多客户端尝试在同时更新同一项中的不同属性,会发生什么。

例如:

1°Case:

{
"PK": "PK1",
"SK": "SK1",
"Attr1: "Value1",
"Attr2: "Value2"
}

一个客户端同时更新“Attr1”,第二个客户端同时更新“Attr2”。

2°Case:

{
"PK": "PK1",
"SK": "SK1",
"Attr1: {
      "SubAttr1": "SubValue1",
      "SubAttr2: "SubValue2"
     }
}

一个客户端同时更新“SubAttr1”,第二个客户端同时更新“SubAttr2”。

这些更新可以通过AppSync解析器完成。

谢谢。

profile picture
专家
已提问 8 个月前42 查看次数
1 回答
0

【以下的回答经过翻译处理】 DynamoDB 采用一种称为乐观锁定的技术来处理并发更新。当多个客户端尝试同时更新同一项时,DynamoDB 确保最后一次写入不会忽略之前的更改而覆盖先前的写入。

第一种情况:当一个客户端同时更新"Attr1" 和另一个客户端更新 "Attr2" 时,这些更新将被视为独立的操作。DynamoDB会合并这些更新并将它们应用于项目而不相互覆盖。因此,两个更新都将成功,最终项目将对 "Attr1" 和 "Attr2" 的更新值。

第二种情况:当一个客户端同时更新"SubAttr1" 和另一个客户端更新 "SubAttr2" 时,这些更新也将被视为独立的操作。然而,由于正在更新的属性嵌套在同一父属性"Attr1" 中,必须使用适当的 DynamoDB 表达式来更新嵌套属性。

使用 UpdateExpression 和"SET" 操作以及适当的文档路径来更新嵌套属性:

UpdateExpression: "SET Attr1.SubAttr1 = :newSubAttr1, Attr1.SubAttr2 = :newSubAttr2"

这将确保仅更新指定的子属性,而在过程中不会丢失任何数据。

在使用 AppSync 解析器时,同样适用相同原理。您需要在 VTL(Velocity 模板语言)脚本中使用正确的映射模板来更新 DynamoDB 中的嵌套属性。这将确保正确处理对不同子属性的并发更新,而不会覆盖或丢失数据。

profile picture
专家
已回答 8 个月前

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

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

回答问题的准则