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