DynamoDB是否支持悲观锁定?

时间:2018-10-03 09:20:49

标签: amazon-web-services amazon-dynamodb

已更新

下面的原始问题-修改后的问题是这样:

在下面忽略我的用例,可以使用dynamo进行老式的悲观锁,从而锁定整个项目以进行并发访问,直到我完成它为止?


按标题快速提问-我所有的谷歌搜索只显示了乐观锁定的说法。

是否想知道是否可以简单地进行“选择更新”?

用例需要先阅读,然后才能更新修改后的版本。最好进行一次读取和一次写入,而不是乐观策略所需的两次读取和一次写入。

谢谢。

1 个答案:

答案 0 :(得分:1)

在Java SDK中,“项”的锁定是作为客户端扩展提供的,您需要做一些工作才能真正使用它。

这样做的原因是dynamo DB的分布式特性。请注意,该锁不是“服务器端”上的经典“基于行”的锁。客户端必须使用相关的“项目”来遵守锁。

用于管理锁的客户端类称为“ AmazonDynamoDBLockClient”。 如果您搜索此类,则会从Amazon SDK开发人员那里找到使用该类的示例。

与此相关的事情:

  • 添加全局ID,以在写“项目”之前询问要锁定的锁
  • 使写手知道锁,并防止写锁处于活动状态
  • 使锁超时,以防万一客户端死锁被释放

从这样的示例中摘录:

    //build a lock client. any other client _not_ using this _same_ lock
    //can still modify the data! this is not 'safe' in this regard!
    final AmazonDynamoDBLockClient client = new AmazonDynamoDBLockClient(
        AmazonDynamoDBLockClientOptions.builder(dynamoDB, "customLockTable")
                .withTimeUnit(TimeUnit.SECONDS)
                .withLeaseDuration(100L)
                .withHeartbeatPeriod(40L)
                .withCreateHeartbeatBackgroundThread(createHeartbeatBackgroundThread)
                .build());
    //try to acquire a lock on the partition key "FirstPart"
    //of course this can fail, since someone else could have the lock
    final Optional<LockItem> lockItem =
            client.tryAcquireLock(AcquireLockOptions.builder("FirstPart").build());

要使上述代码正常工作,您需要创建一个特定的“ customLockTable”,这自然不是数据库后端的一部分。因此,以上示例不完整!