您当前位置:资讯中心 >开发 >浏览文章

实战与原理:如何基于RocketMQ实现分布式事务?

来源:不详 日期:2024/1/26 13:17:00 阅读量:(0)

使用事务消息

在DailyMart系统中,用户发起支付后,订单系统需要调用库存服务执行库存扣减逻辑。图片

由于这是跨服务调用,因此会产生分布式事务。在这里,我们使用RocketMQ的事务消息来实现分布式事务。

1、首先,在订单服务的应用服务层处理支付逻辑,并调用RocketMQ发送事务消息:

@Override
public String payment(String orderSn) {
    // todo 集成支付宝支付
    // 支付流水号
    String outOrderNo = IdUtils.get32UUID();
    TradeOrder tradeOrder = Optional.ofNullable(tradeOrderService.getByOrderSn(orderSn)).orElseThrow(() -> new BusinessException("订单编号不存在"));

    // 如果订单处于待支付状态
    if (Objects.equals(tradeOrder.getStatus(), OrderStatusEnum.WAITING_PAYMENT.getStatus())) {

        OrderPaidEvent orderPaidEvent = new OrderPaidEvent(orderSn, outOrderNo);

        TransactionSendResult sendResult = enhanceTemplate.sendTransaction("TRADE-ORDER", "ORDER-PAID");

        if (SendStatus.SEND_OK == sendResult.getSendStatus() && sendResult.getLocalTransactionState() == LocalTransactionState.COMMIT_MESSAGE) {
            return tradeOrder.getOrderSn();
        } else {
            throw new BusinessException("支付失败...");
        }
    } else {
        throw new BusinessException("订单已支付,请勿重复提交...");
    }
}
关键字:
声明:我公司网站部分信息和资讯来自于网络,若涉及版权相关问题请致电(63937922)或在线提交留言告知,我们会第一时间屏蔽删除。
有价值
0% (0)
无价值
0% (10)

分享转发:

发表评论请先登录后发表评论。愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。