使用 DynamoDb 回滚?

Edu*_*uBw 3 amazon-dynamodb

我有一个问题,如果我在 DynamoDb 中插入 5 o 6 个元素,但例如 6º 失败。如何在 dynamoDb 中进行回滚?

    MyMessage myMessage = new MyMessage(true, "ok");
    Article art;

    for (int i = 0; i < list.size(); i++) {
        art= (Article) list.get(i);
        try {
            this.artRepository.save(art);
        } catch (Exception e) {
            myMessage.setSuccess(false);
            myMessage.setMessage("Fail.");
        }
    }

    if(myMessage.isSuccess()) {
        artRepository.save..
    }else{
      Rollback.
    }
Run Code Online (Sandbox Code Playgroud)

tle*_*eef 5

编辑: DynamoDB 现在支持事务。

DynamoDB 有两个新的 API 操作TransactWriteItemsTransactGetItems

使用这些操作,您可以对 DynamoDB 表执行 ACID 事务。

更多细节在这里

旧答案

DynamoDB 不支持这种事务行为。

首先,您不应该像这样在 for 循环中发出多个请求。这是一种网络资源的浪费。您最好使用批处理请求。请记住,批处理请求中的项目仍然是独立的,并且可能彼此独立失败。

如果您需要使用 Dynamo 支持这种类型的行为,您可以考虑使用更持久的插入文档的方法,例如首先将它们放入 SQS 或 Kinesis(两者也支持批量请求)。如果插入失败,您可以可靠地重试。在重复失败的情况下,您可以使用死信队列,甚至将项目发送到 SNS 以触发某种警报。

如果出于一致性原因需要 DB 强制执行事务,则应考虑使用 SQL 数据库。

  • 看起来它确实在 Java https://aws.amazon.com/blogs/aws/dynamodb-transaction-library/ 和其他高级 API 中支持它。在 noSQL 中需要事务是有正当理由的,例如根据一些细节更新或放置来编写聚合记录。 (3认同)