事务内嵌异步:如何保证当前事务执行在前,异步执行在后的顺序问题!

开门见山,直接上代码演示!

事务内嵌了异步

/**
 * Transaction embedded with async
 */
@Service
@Transactional(readOnly = true)
public class NormalService {

        @Autowired
        FooService fooService;
        
        @Autowired
        BarService barService;
        
        @Autowired
        TransactionSyncHandler transactionSyncHandler;

        @Transactional(readOnly = false, rollbackFor = Exception.class)
        public void foo() throws Exception {

                // sync method
                fooService.sync();

                final OrderID finalOrderID = new OrderID("123");
                transactionSyncHandler.handle(() -> {
                        // async method
                        barService.async(finalOrderID);
                });

        }

}

含有异步方法的服务

/**
 * This service contains async method
 */
@Component
public class BarService {

        /**
         * async method
         */
        @Async
        public void async(OrderID orderID) throws Exception {
            // send message
        }

}

自定义事务同步处理器

/**
 * Self defined transaction sync handler
 */
@Slf4j
@Component
public class TransactionSyncHandler {

        public void handle(Runnable runnable) {
                if (TransactionSynchronizationManager.isActualTransactionActive()) {
                        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                                @Override
                                public void afterCommit() {
                                        try {
                                                runnable.run();
                                        } catch (Exception e) {
                                                log.error(Throwables.getStackTraceAsString(e));
                                        }
                                }
                        });
                } else {
                        runnable.run();
                }
        }

}