DynamoDB 默认有锁定吗?

Posted

技术标签:

【中文标题】DynamoDB 默认有锁定吗?【英文标题】:Does DynamoDB have locking by default? 【发布时间】:2018-06-20 07:17:28 【问题描述】:

我正在查看 dynamo 文档,看起来他们很乐观。我想知道这是否默认使用。

从文档看来,您需要编写 Java 应用程序以使用 @DynamoDBVersionAttribute 注释并获取和设置版本。如果不这样做,您似乎可以在没有任何锁定的情况下写入 DynamoDB。

对吗?

顺便说一句,我对没有某种锁定的数据库不太熟悉,那么如果 2 个人在 DynamoDB 中同时写入同一个项目而没有任何锁定会发生什么?假设我们正在写入的项目有 4 个字段,一个写入是否会完全失败,或者 DynamoDB 是否有可能用 1 个写入更新 2/4 个字段,而另一个写入更新另外 2 个字段?

【问题讨论】:

【参考方案1】:

你是对的。默认情况下,DynamoDB 没有乐观锁定。 DynamoDB 有多种 SDK,据我所知,唯一提供 optimistic locking functionality is the Java SDK 的 SDK。

以下是 Java SDK 乐观锁定实际支持的内容:

在您的表中创建一个名为 version 的属性 您必须在更新之前从数据库中加载项目 当您尝试保存项目时,SDK 会测试客户端项目版本号是否与表中的版本号匹配,如果匹配,则保存完成并增加版本号

如果您使用不同的 SDK,这很容易实现。您将自己创建版本属性。您将为putItem 方法(以及任何其他必需的保存/更新操作)创建一个包装器。您可以使用Condition Expression 来测试数据库中的版本号是否比您保存的版本号小一。

要回答您问题的第二部分,两次更新都会成功(假设您没有对更新设置任何条件)。第一个将进行指定的任何更新,第二个将出现并覆盖它们。

【讨论】:

谢谢!所以我假设每次写入都必须是原子的?例如,第一次写入不能部分完成,然后第二次写入开始。 正确,没有部分写入。 puItem、updateItem 和 deleteItem 是原子的。【参考方案2】:

Dynamodb 默认不支持乐观锁定。正如您所提到的,您需要在 Java 模型类中使用注解才能使用乐观锁定。

如果两个线程写入同一个项目,Dynamodb 项目将拥有最后一个写入数据(即最后一个写入数据的线程)。

【讨论】:

以上是关于DynamoDB 默认有锁定吗?的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDB save()API:乐观锁定和SaveBehavior

无法使用 localstack dynamoDB 锁定 terraform 状态:UnrecognizedClientException

Dynamodb 我可以用两个 GSI 查询吗?

我们可以避免在 dynamodb 中进行扫描吗

DynamoDB 乐观锁

DynamoDB 是 Swift 应用程序的好选择吗? [关闭]