首页 > 解决方案 > DynamoDB 更新是否具有强一致性?

问题描述

DynamoDB 快速且可扩展的全部原因在于它最终是一致的。但同时,它带有用于诸如、、之ConsistentRead类的操作的选项,它可以帮助您确保您正在读取的数据是最新的。getbatchGetquery

我的问题是关于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使其高度一致的选项。

这是一个有效的担忧吗?我能做些什么来帮助这个吗?

标签: amazon-web-servicesamazon-dynamodbconsistencyeventual-consistency

解决方案


没有强烈一致的更新;强一致性适用于读取,其中基本上在写入后立即查看的数据对于实体的所有观察者来说都是一致的。

当您的应用程序将数据写入 DynamoDB 表并收到 HTTP 200 响应 (OK) 时,写入已发生(在至少一个存储位置)并且是持久的。数据最终在所有存储位置保持一致,通常在一秒或更短的时间内。然后,您可以选择以最终一致性或强一致性方式读取此数据。

应使用乐观并发处理对同一项目的并发写入,您可以使用 DynamoDB 事务库(在适用于 Java 的 AWS 开发工具包中提供)进行条件写入。

如果您需要以原子方式更新多个项目,您可以使用 DynamoDB 事务。

DynamoDB 事务为开发人员提供跨单个 AWS 账户和区域内的一个或多个表的原子性、一致性、隔离性和持久性 (ACID)。在构建需要对多个项目进行协调插入、删除或更新作为单个逻辑业务操作的一部分的应用程序时,您可以使用事务。

https://aws.amazon.com/blogs/aws/new-amazon-dynamodb-transactions/

或者,您的用例可能会受益于DynamoDB 全局表,该表在并发写入之间使用“最后写入者获胜”协调。


推荐阅读