DynamoDB - 如何检索和删除(弹出)项目?

时间:2014-03-31 05:48:13

标签: concurrency race-condition amazon-dynamodb

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

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

但是,通过检索然后删除该值,可以在检索和删除之间发生竞争条件。

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

1 个答案:

答案 0 :(得分:1)

如果你的逻辑:

  1. 获取项目
  2. 删除
  3. 没有任何额外的逻辑来确定是否应该发生删除,那么你实际上可以立即发送删除请求,这里是示例(我没有检查过,主要来自:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelJavaItemCRUD.html

    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();
    

    文档:

    withReturnValues

    getAttributes