2014-03-31 43 views
0

我正在使用Flask編寫的應用程序,並且通過boto訪問Amazon的DynamoDB作爲後臺。DynamoDB - 如何檢索和刪除(彈出)一個項目?

對於特定用例,我們需要從表中檢索一個值,然後使其不可用於其他用戶。

但是,通過檢索並刪除值,檢索和刪除之間可能會出現競爭條件。

有什麼辦法從表中檢索一個項目,並立即刪除或以原子方式更新它?

+0

可以刪除項目,並得到前一項爲刪除操作的結果,它會爲你工作? –

+0

這將工作。你能發佈一個簡短的示例代碼答案,以便我可以upvote你並標記爲已解決? – 0x90

回答

1

如果你的邏輯:

  1. 獲取項
  2. 刪除

沒有任何額外的邏輯,以確定是否應進行刪除,那麼實際上你可以立即發送刪除請求,我這裏是(我沒有檢查它,大多是從拿: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

+0

這裏有沒有競爭條件的可能性? IIRC你可以選擇一個讀後寫入一致性的DynamoDB選項,所以你付出更多的可能工作(第二次刪除錯誤...) –

+0

@AndyHayden AFAIR,如果你使用讀取操作,它可能會返回已刪除的項目,但如果你使用刪除操作應該是非常一致的。或者你可以通過使用條件表達式來強制它們一致,比如'id = 101' –