我正在使用Flask編寫的應用程序,並且通過boto訪問Amazon的DynamoDB作爲後臺。DynamoDB - 如何檢索和刪除(彈出)一個項目?
對於特定用例,我們需要從表中檢索一個值,然後使其不可用於其他用戶。
但是,通過檢索並刪除值,檢索和刪除之間可能會出現競爭條件。
有什麼辦法從表中檢索一個項目,並立即刪除或以原子方式更新它?
我正在使用Flask編寫的應用程序,並且通過boto訪問Amazon的DynamoDB作爲後臺。DynamoDB - 如何檢索和刪除(彈出)一個項目?
對於特定用例,我們需要從表中檢索一個值,然後使其不可用於其他用戶。
但是,通過檢索並刪除值,檢索和刪除之間可能會出現競爭條件。
有什麼辦法從表中檢索一個項目,並立即刪除或以原子方式更新它?
如果你的邏輯:
沒有任何額外的邏輯,以確定是否應進行刪除,那麼實際上你可以立即發送刪除請求,我這裏是(我沒有檢查它,大多是從拿: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();
文檔:
這裏有沒有競爭條件的可能性? IIRC你可以選擇一個讀後寫入一致性的DynamoDB選項,所以你付出更多的可能工作(第二次刪除錯誤...) –
@AndyHayden AFAIR,如果你使用讀取操作,它可能會返回已刪除的項目,但如果你使用刪除操作應該是非常一致的。或者你可以通過使用條件表達式來強制它們一致,比如'id = 101' –
可以刪除項目,並得到前一項爲刪除操作的結果,它會爲你工作? –
這將工作。你能發佈一個簡短的示例代碼答案,以便我可以upvote你並標記爲已解決? – 0x90