amazon-web-services - DynamoDB 更新是否具有强一致性?
问题描述
DynamoDB 快速且可扩展的全部原因在于它最终是一致的。但同时,它带有用于诸如、、之ConsistentRead
类的操作的选项,它可以帮助您确保您正在读取的数据是最新的。get
batchGet
query
我的问题是关于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 表并收到 HTTP 200 响应 (OK) 时,写入已发生(在至少一个存储位置)并且是持久的。数据最终在所有存储位置保持一致,通常在一秒或更短的时间内。然后,您可以选择以最终一致性或强一致性方式读取此数据。
应使用乐观并发处理对同一项目的并发写入,您可以使用 DynamoDB 事务库(在适用于 Java 的 AWS 开发工具包中提供)进行条件写入。
如果您需要以原子方式更新多个项目,您可以使用 DynamoDB 事务。
DynamoDB 事务为开发人员提供跨单个 AWS 账户和区域内的一个或多个表的原子性、一致性、隔离性和持久性 (ACID)。在构建需要对多个项目进行协调插入、删除或更新作为单个逻辑业务操作的一部分的应用程序时,您可以使用事务。
https://aws.amazon.com/blogs/aws/new-amazon-dynamodb-transactions/
或者,您的用例可能会受益于DynamoDB 全局表,该表在并发写入之间使用“最后写入者获胜”协调。
推荐阅读
- excel - Power Query 空问题
- javascript - 自动关闭模态弹出窗口,而不是使用按钮/单击
- mysql - 平等在MySQL中真的意味着平等吗?
- reactjs - 我正在用 react 和 flask 构建一个不和谐的 oauth2 应用程序。这是正确的方法吗?
- java - 一个线程池Java的多个CompletionService
- c++ - Cap'n'proto过早破坏接口?
- google-apps-script - Google Apps 脚本对 GmailApp 的限制
- couchdb - 如何在 Couchdb/Couchbase 中为帖子实现喜欢和不喜欢计数
- django - 使用 Django m2m_changed 信号,有没有办法知道删除了哪个关系?
- python - youtube-dl 下载无法播放的音频文件