Spring事务同步工具类

Spring的事务提供了一套事务同步的机制,暴露一些钩子给用户来执行自己的逻辑。基于此封装了事务钩子工具类。有时候可能我们想当前方法事务提交之后执行一些逻辑,比如发送消息到MQ中,那么可以很优雅的使用该工具类来实现这个目的,而不用将发生消息到MQ这段逻辑放到事物方法外面。

public final class TransactionUtils {

    private TransactionUtils() {}

    /**
     * 事务提交之后执行
     * @param action 动作
     */
    public static void executeAfterCommit(Runnable action) {
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCommit() {
                    action.run();
                }
            });
        }
    }

    /**
     * 事务回滚之后执行
     * @param action 动作
     */
    public static void executeAfterRollback(Runnable action) {
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCompletion(int status) {
                    if (TransactionSynchronization.STATUS_ROLLED_BACK == status) {
                        action.run();
                    }
                }
            });
        }
    }

    /**
     * 事务完成后执行, 回滚或者提交都有可能
     * 根据status来判断
     * @param action 动作
     */
    public static void executeAfterCompletion(Consumer<Integer> action) {
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCompletion(int status) {
                    action.accept(status);
                }
            });
        }
    }
}

不使用该工具类写法

@Service
public class BizService {
    
    @Transactional
    public void execute() {
        // doSomething
    }
}

@Service
public class AnotherService {
    
    @Autowired
    private BizService bizService;

    public void doAction() {
        // 事务方法
        bizService.execute();
        // 发送消息
        sendMq();
    }
}

使用工具类后

@Service
public class BizService {

    @Transactional
    public void execute() {
        // doSomething
        // 事务提交后执行逻辑
        TransactionUtils.executeAfterCommit(() -> {
            // 发送消息
            sendMq();
        });
    }
}
posted on 2023-08-08 21:52  wastonl  阅读(172)  评论(0编辑  收藏  举报