DynamoDB 默认有锁吗?

Does DynamoDB have locking by default?

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

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

对吗?

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

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

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

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

的 SDK

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

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

如果您使用不同的 SDK,您自己实现起来非常简单。您将自己创建版本属性。您将为 putItem method (and any other required save/update operations). You would use the Condition Expression 创建一个包装器来测试数据库中的版本号是否比您保存的版本少一个。

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