事务中边缘业务如何编写代码

2021-02-23  本文已影响0人  曾小姿

备注:消息最终一致性的补偿机制、分布式事务场景不在本规范范畴内

问题

业务场景

业务需求上经常会有一些边缘操作,比如主流程操作A:用户报名课程操作入库,边缘操作B:发送邮件或短信通知。

业务要求

实现方案

1、使用TransactionSynchronizationManager在事务提交之后操作

@Transactional
public void insert(TechBook techBook){
        bookMapper.insert(techBook);
       // send after tx commit but is async
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
            @Override
            public void afterCommit() {
                System.out.println("send email after transaction commit...");
            }
        }
       );
    }

2、使用@TransactionalEventListener处理数据库事务提交成功后再执行操作

    @Transactional
    public void finishOrder(Order order){
        // 修改订单成功
        updateOrderSuccess(order);
    
        // 发布 Spring Event 事件
        applicationEventPublisher.publishEvent(new MyAfterTransactionEvent(order));
    }
    
    @Slf4j
    @Component
    private static class MyTransactionListener {
        @Autowired
        private MqService mqService;

        @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
        private void onHelloEvent(MyAfterTransactionEvent event) {
            Order order = event.getOrder();
            mqService.send(order);
        }
    }

    // 定一个事件,继承自ApplicationEvent 
    private static class MyAfterTransactionEvent extends ApplicationEvent {

        private Order order;

        public MyAfterTransactionEvent(Object source, Order order) {
            super(source);
            this.order = order;
        }

        public Order getOrder() {
            return order;
        }
    }

分析对比

TransactionSynchronizationManager

TransactionalEventListener

结论

旧有消息发送采用TransactionSynchronizationManager覆盖,新增消息发送用TransactionalEventListener设计解决

上一篇 下一篇

猜你喜欢

热点阅读