Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services DynamoDB支持悲观锁定吗?_Amazon Web Services_Amazon Dynamodb - Fatal编程技术网

Amazon web services DynamoDB支持悲观锁定吗?

Amazon web services DynamoDB支持悲观锁定吗?,amazon-web-services,amazon-dynamodb,Amazon Web Services,Amazon Dynamodb,已更新 以下原始问题-修订后的问题如下: 忽略我下面的用例,使用dynamo可以做一个老式的悲观锁,即在我完成之前锁定整个项目以进行并发访问吗 快速提问,根据标题-我所有的谷歌搜索只显示乐观锁定 想知道是否可以简单地执行“选择更新”的等效操作 用例需要读取,然后更新修改的版本。最好只进行一次读取和一次写入,而不是乐观策略所需的两次读取和一次写入 谢谢。在Java SDK中,“items”的锁定是作为客户端扩展提供的,您需要做一些工作来实际使用它 原因是dynamo DB的分布式特性。请注意,该

已更新

以下原始问题-修订后的问题如下:

忽略我下面的用例,使用dynamo可以做一个老式的悲观锁,即在我完成之前锁定整个项目以进行并发访问吗


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

想知道是否可以简单地执行“选择更新”的等效操作

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


谢谢。

在Java SDK中,“items”的锁定是作为客户端扩展提供的,您需要做一些工作来实际使用它

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

用于管理锁的客户端类称为“AmazonDynamoDBLockClient”。 如果您搜索这个类,您将从AmazonSDK开发人员那里找到使用它的示例

需要处理的事项:

  • 在写入“项”之前,为要询问的锁添加全局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());
//构建一个锁客户端。没有使用此锁的任何其他客户端
//仍然可以修改数据!这在这方面是不“安全”的!
最终AmazonDynamoDBLockClient=新的AmazonDynamoDBLockClient(
AmazonDynamoDBLockClientOptions.builder(dynamoDB,“customLockTable”)
.带时间单位(时间单位秒)
.带最小重量(100L)
.带心跳周期(40L)
.withCreateHeartbeatBackgroundThread(createHeartbeatBackgroundThread)
.build());
//尝试获取分区密钥“FirstPart”的锁
//当然,这可能会失败,因为其他人可能拥有锁
最终可选锁定项=
client.tryAcquireLock(AcquireLockOptions.builder(“FirstPart”).build());

要使上述代码正常工作,您需要创建一个特定的“customLockTable”,它本质上不是DB后端的一部分。因此,上述样本是不完整的

我查看了“UpdateItem”的文档,它看起来像是在自然地对单个“项”进行原子级的读取/更新。这是您想要的还是您的用例更复杂?顺便说一句:我认为我的上述评论不够清楚:您想要完成的任务实际上只是部分与乐观锁定相关。悲观锁定只定义了并发执行操作和“最后一个编写者将获胜”的情况下的行为。这实际上是危险的。可以在“DynamoDBMapperConfig.SaveBehavior”配置中启用它。@PeterBranforn我的理解是,除非您指定乐观锁定(我认为java api提供了乐观锁定),否则最后一次写入将获胜。乐观锁定使用一个版本号——在写入之前需要先读取,这样您就可以查看版本号是否已更改。如果可能的话,我想对项目执行一个悲观风格的锁定,这样在第一个更新完成之前,其他客户机就无法尝试进行更新。啊,现在我有了你的问题:当你执行“更新”操作时,中间读取会在ORM层自动执行。因此,您不必在更新项目之前手动执行它。@PeterBranforn-Peter!我想我对你的轻蔑帮助我解决了我的问题——正如你最初提到的那样。我的问题仍然存在(我认为),但对于我的用例,我不再确定这是否是一个问题。因为我无论如何都需要先读取,所以我可以基于此进行条件更新。谢谢。谢谢-这回答了我的问题,并给出了解释原因的上下文。