首页 > 解决方案 > DynamoDB 是否支持悲观锁定?

问题描述

更新

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

忽略下面我的用例,使用发电机可以做一个老式的悲观锁,整个项目被锁定以进行并发访问,直到我完成它?


根据标题,快速提问——我所有的谷歌搜索都只显示了乐观锁定。

想知道是否可以简单地执行相当于“选择更新”的操作?

用例需要读取,然后更新修改的版本。进行一次读取和一次写入会很好,而不是乐观策略所需的 2 次读取和一次写入。

谢谢。

标签: amazon-web-servicesamazon-dynamodb

解决方案


“项目”的锁定是作为 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”,这本质上不是数据库后端的一部分。所以上面的例子是不完整的!


推荐阅读