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