DynamoDB默认情况下是否具有锁定?

Kev*_*vin 9 locking optimistic-locking amazon-dynamodb

我正在查看dynamo文档,看起来他们很乐观。我想知道这是否默认使用。从文档中看来,您需要编写Java应用程序才能使用@DynamoDBVersionAttribute批注并获取和设置版本。无需执行此操作,看起来您无需任何锁定即可写入dynamoDB。

那是对的吗?

附带一提,我对没有某种锁定的数据库不太熟悉,因此,如果2个人在DynamoDB中同时写入同一项目而没有任何锁定怎么办?假设我们要写入的项目有4个字段,一个写入会完全失败,还是dynamodb用1个写入更新2/4个字段,而用另外2个写入更新另外2个字段?

F_S*_*O_K 10

你是对的。DynamoDB默认情况下不具有乐观锁定。DynamoDB有各种SDK,据我所知,唯一提供乐观锁定功能的是Java SDK

这是Java SDK乐观锁定实际支持的功能:

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

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

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


not*_*est 5

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

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