【问题标题】:RestCall Transaction issue for Rollback Scenarios回滚场景的 RestCall 事务问题
【发布时间】:2020-08-01 19:31:29
【问题描述】:

我正在使用 Spring Boot,但在 Transactions 方面没有太多经验...

@Service
@Transactional
class FundTransferService {
    public void doSomeFunds(){

        if(realPaymentGateway()){
            //then do db call, to update User Transaction details, WHAT IF SERVER GOES DOWN HERE OR ANY EXCEPTION??
        }

    }

    public boolean realPaymentGateway(){
        //Using Braintree to transfer Funds
    }
}

上面发生了两件事,paymentGateway(这是一些休息电话),如果成功,则只需 使用用户交易详细信息更新数据库

我希望以上 2 件事应该发生原子,我的意思是(休息和 DB)都成功,或者回滚一切..

我的问题是:

Q1)在更新数据库详细信息时,由于某些异常或服务器出现故障,可能仅针对数据库内容发生回滚,而不是 RESTCALL..

Q2) 我应该先更新数据库,然后再使用 PaymentGateway 进行资金转移还是反向应该是正确的?请给我建议..

希望您能理解我的问题,那么上述问题的解决方案是什么?

【问题讨论】:

  • 那么,真的没有办法阻止吗?那么亚马逊、Ebay 或其他电子商务网站等大型网站的表现如何?

标签: spring spring-boot transactions spring-data-jpa spring-transactions


【解决方案1】:

您无法自动执行您想做的事情,例如跨越分布式事务,因为Braintree 是您无法控制的 REST 服务。

但是,您可以调用 Braintree,然后相应地更新您的数据库。这样,在您的大脑树调用和事务提交之间有一个最小的时间窗口,您的服务器会意外“被杀死”,但在这个答案的范围内没有简单的方法。

您还可以有某种预写日志,您可以在其中尝试记住要调用的 REST 服务,然后与发生的实际 REST 调用进行协调,但这有点复杂,而且很有可能矫枉过正。

【讨论】:

  • 那么,真的没有办法阻止吗?那么亚马逊、Ebay 等大型网站在做什么呢?
  • 您的问题没有简单的答案。它完全取决于工作流程以及您可以访问的技术,例如分布式事务/XA。等
【解决方案2】:

您只能对事务性资源应用事务。据我了解,您有 1 个非事务性输入(进一步,TX)(带有付款请求的调用)和 2 个输出(非 TX 远程 REST 调用和 TX SQL 数据库)。如果你想保持实时一致性,我可以提出下一个架构方法: - 将支付请求放入消息队列。 MQ Broker 必须支持 XA 协议进行 2PC 提交(例如 ActiveMQ); - 您的服务使用 XA 连接从队列中读取消息,向远程服务器发送 REST 请求,并使用 XA 连接将数据保存到数据库(也支持 XA 协议); - 如果 REST 调用失败或其他原因,您将回滚更改并重新开始处理队列中的付款请求。顺便说一句,您的远程 REST 资源必须是幂等的;

如果您使用的是非事务性资源,则无法保持一致。 此外,您还可以在 Atomikos 网站上查找有关使用 2PC 的信息。

【讨论】:

    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多