随笔 - 145  文章 - 0  评论 - 6  阅读 - 18万

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   wastonl  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2016-08-08 poj1094
2016-08-08 poj3026
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示