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
)。我担心的是,如果由于最终DynamoDB的一致性而在执行update
操作时,没有记录匹配且更新失败。如前所述,update
操作不带有ConsistentRead
选项来使其高度一致。
这是一个有效的问题吗?我有什么可以帮助您的吗?
没有强烈一致的更新。 严格一致性适用于读取,基本上在写入后立即查看的数据对于实体的所有观察者而言都是一致的。
当您的应用程序将数据写入DynamoDB表并收到HTTP 200响应(OK)时,该写入已发生(在至少一个存储位置)并且是持久的。最终,所有存储位置的数据通常保持一秒或更短的时间一致。然后,您可以选择以最终或强烈一致性的方式读取此数据。
对同一项目的并发写入应采用乐观的并发处理,您可以使用DynamoDB事务库(适用于Java的AWS开发工具包中)进行条件写入。
如果您需要原子地更新多个项目,则可以使用DynamoDB事务。
DynamoDB事务为开发人员提供了原子性,一致性,跨一个表中的一个或多个表的隔离和持久性(ACID)一个AWS帐户和区域。您可以在构建时使用交易需要协调的插入,删除或更新的应用程序多个项目作为单个逻辑业务操作的一部分。
https://aws.amazon.com/blogs/aws/new-amazon-dynamodb-transactions/
或者,您的用例可能会受益于DynamoDB全局表,它使用并发写入之间的“最后写入者获胜”对帐。