Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
Concurrency DynamoDB-如何检索和删除(pop)项目?_Concurrency_Race Condition_Amazon Dynamodb - Fatal编程技术网

Concurrency DynamoDB-如何检索和删除(pop)项目?

Concurrency DynamoDB-如何检索和删除(pop)项目?,concurrency,race-condition,amazon-dynamodb,Concurrency,Race Condition,Amazon Dynamodb,我正在开发一个用Flask编写的应用程序,它由通过boto访问的Amazon的DynamoDB提供支持 对于特定的用例,我们需要从表中检索一个值,然后使它对其他用户不可用 但是,通过检索然后删除该值,在检索和删除之间可能会出现竞争条件 有没有办法从表中检索项目并立即以原子方式删除或更新它?如果您的逻辑: 获取项目 删除 如果不需要任何额外的逻辑来确定是否应该进行删除,那么您实际上可以立即发送删除请求,下面是一个示例(我没有检查它,主要取自:) HashMap key=newhashmap();

我正在开发一个用Flask编写的应用程序,它由通过boto访问的Amazon的DynamoDB提供支持

对于特定的用例,我们需要从表中检索一个值,然后使它对其他用户不可用

但是,通过检索然后删除该值,在检索和删除之间可能会出现竞争条件

有没有办法从表中检索项目并立即以原子方式删除或更新它?

如果您的逻辑:

  • 获取项目
  • 删除
  • 如果不需要任何额外的逻辑来确定是否应该进行删除,那么您实际上可以立即发送删除请求,下面是一个示例(我没有检查它,主要取自:)

    HashMap key=newhashmap();
    key.put(“Id”,新的AttributeValue(),带n(“101”);
    DeleteItemRequest DeleteItemRequest=新的DeleteItemRequest()
    .withTableName(tableName)
    .带钥匙(钥匙)
    .带有ReturnValue(ReturnValue.ALL_OLD);
    DeleteItemResult DeleteItemResult=client.deleteItem(deleteItemRequest);
    Map deletedItem=deleteItemResult.getAttributes();
    
    文件:


    您可以删除项目,并通过删除操作获得上一个项目,它对您有效吗?有效。你能发布一个简短的示例代码答案吗?这样我就可以投票给你并将其标记为已解决?这里是否存在种族条件的可能性?IIRC您可以选择写后读一致性的DynamoDB选项,这样您就可以支付更多的可能工作的费用(第二次删除时出错…@AndyHayden AFAIR),如果您使用读取操作,它可能会返回已删除的项目,但如果您使用删除操作,它应该是强一致的。或者,您可以使用条件表达式强制它们保持一致,如
    id=101
    HashMap<String, AttributeValue> key = new HashMap<String, AttributeValue>();
    key.put("Id", new AttributeValue().withN("101"));
    
    DeleteItemRequest deleteItemRequest = new DeleteItemRequest()
        .withTableName(tableName)
        .withKey(key)
        .withReturnValues(ReturnValue.ALL_OLD);
    
    DeleteItemResult deleteItemResult = client.deleteItem(deleteItemRequest);
    Map<String,AttributeValue> deletedItem = deleteItemResult.getAttributes();