【发布时间】:2020-03-10 19:39:46
【问题描述】:
DynamoDB 快速且可扩展的全部原因在于它最终是一致的。但同时,它还为get、batchGet 和query 等操作提供了ConsistentRead 选项,可帮助您确保正在读取的数据是最新的。
我的问题是关于update 操作。首先,它没有ConsistentRead 选项(一个原因是,update 不是读取!)。但同时,您可以使用ConditionExpression 以原子方式更新记录,如下所示:
await docClient.update({
TableName: 'SomeTable',
Key: {id},
UpdateExpression: "set #status = :new_status",
ConditionExpression: '#status = :old_status',
ExpressionAttributeNames: {
"#status": "status",
},
ExpressionAttributeValues: {
":old_status": "available",
":new_status": "done",
},
}).promise()
这将确保在更新时,旧值是available,如果不是,操作将失败并抛出异常。所以,在某种意义上,你可以说update是强一致的。
但我的问题是关于您需要确保记录存在的场景。假设您有一个插入记录的函数。另一个更新相同记录的记录(给定它的id)。我担心的是,如果在执行 update 操作时,由于 DynamoDB 的最终一致性,没有匹配的记录并且更新失败。如前所述,update 操作不附带ConsistentRead 选项以使其强一致。
这是一个有效的担忧吗?有什么我可以做的吗?
【问题讨论】:
-
您对 DynamoDB 并发模型的担忧是有效的,不知道为什么它在没有给出适当反馈的情况下被其他成员投票否决。
-
嗨@Mehran,我回答你的问题了吗?
标签: amazon-web-services amazon-dynamodb consistency eventual-consistency