代码之家  ›  专栏  ›  技术社区  ›  Kevin

DynamoDB默认有锁定吗?

  •  14
  • Kevin  · 技术社区  · 7 年前

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

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

    对吗?

    另一方面,我不太熟悉没有某种锁定的DBs,所以如果两个人在DynamoDB中同时写入同一个项目而没有任何锁定,会发生什么?假设我们正在写入的项目有4个字段,一个写操作是否会完全失败,或者DynamoDB是否可能用1个写操作更新2/4个字段,而用另一个写操作更新其他2个字段?

    2 回复  |  直到 5 年前
        1
  •  17
  •   F_SO_K    7 年前

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

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

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

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

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

        2
  •  5
  •   notionquest    7 年前

    默认情况下,Dynamodb不支持乐观锁定。如前所述,为了使用乐观锁定,需要在Java模型类中使用注释。

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