【问题标题】:Dynamo DB Optimistic Locking Behavior during Save Action保存操作期间的 Dynamodb 乐观锁定行为
【发布时间】:2023-03-28 15:07:02
【问题描述】:

场景:我们有一个支持带有版本号的乐观锁定的 Dynamo DB 表。两个并发线程试图将具有相同主键值的两个不同条目保存到该表中。

问题:后面的保存操作会抛出 ConditionalCheckFailedException 吗?

【问题讨论】:

  • 请关注您的问题并提出后续问题。如果我的回答解决了您的疑问,请告诉我?

标签: amazon-web-services amazon-dynamodb amazon optimistic-locking optimistic-concurrency


【解决方案1】:

是的,尝试插入相同数据的第二个线程会抛出 ConditionalCheckFailedException

com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException

一旦项目保存在数据库中,后续更新的版本应该与 DynamoDB 表上的值(即服务器端值)匹配。

save — 对于新项目,DynamoDBMapper 分配一个初始版本 数字 1. 如果您检索一个项目,更新它的一个或多个 属性并尝试保存更改,保存操作 仅当客户端的版本号和 服务器端匹配。 DynamoDBMapper 增加版本号 自动。

【讨论】:

    【解决方案2】:

    过去我们有一个类似的用例,但在我们的例子中,多个线程首先从 dynamoDB 读取,然后尝试更新值。

    所以最终在他们阅读时版本会发生变化,他们会尝试更新文档,如果您没有从 DynamoDB 中读取最新值,那么中间更新将丢失(这被称为更新丢失问题更多信息请参考aws-docs)。

    我不确定,如果您有这个用例,但如果您只有 2 个线程尝试更新值,然后如果其中一个线程在他们的请求到达 DynamoDB 时获得不同的版本,那么您将收到 @987654323 @异常。

    关于这个错误的更多信息可以在这里找到http://grepcode.com/file/repo1.maven.org/maven2/com.michelboudreau/alternator/0.10.0/com/amazonaws/services/dynamodb/model/ConditionalCheckFailedException.java

    【讨论】:

      猜你喜欢
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      相关资源
      最近更新 更多