TransactionSynchronizationManager事务管理嵌套情况分析

418 阅读1分钟

TransactionSynchronizationManager事务管理嵌套情况分析

    /**
     * 在事务提交后执行
     *
     * @param runnable 任务
     */
    public static void afterCommitExecute(Runnable runnable) {
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCommit() {
                    runnable.run();
                }
            });
        } else {
            runnable.run();
        }
    }
​
​
    /**
     * 事务回滚后执行
     *
     * @param runnable 任务
     */
    public static void afterCompletionExecute(Runnable runnable) {
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCompletion(int status) {
                    runnable.run();
                }
            });
        } else {
            runnable.run();
        }
    }

afterCommit里面嵌套afterCompletion

      TransactionUtils.afterCommitSynExecute(()->{
            System.out.println("1");
            TransactionUtils.afterCompletionSynExecute(()->{
                System.out.println("2");
            });
            System.out.println("3");
      });
      System.out.println("4");

结果 4,1,3,2

afterCommit执行时,还没有调用了triggerAfterCompletion,afterCompletion可以被注册进去。

注册进去后,但是监听事务完成,但是事务真正commit之后 ,直接走了final里面的afterCompletionSynExecute

afterCompletion里面嵌套afterCompletion

    TransactionUtils.afterCompletionSynExecute(()->{
            System.out.println("1");
            TransactionUtils.afterCompletionSynExecute(()->{
                System.out.println("2");
            });
            System.out.println("3");
        });
        System.out.println("4");

结果:4,1,2,3

afterCompletion执行时,调用了triggerAfterCompletion,TransactionSynchronizationManager.isSynchronizationActive() 为false,活跃事务被清除,里面的afterCompletion可以被通过非事务模式执行。

afterCommit里面嵌套afterCommit

 TransactionUtils.afterCommitSynExecute(()->{
            System.out.println("1");
            TransactionUtils.afterCommitSynExecute(()->{
                System.out.println("2");
            });
            System.out.println("3");
        });
        System.out.println("4");

结果4,1,3

afterCommit执行时,没有调用了triggerAfterCompletion,TransactionSynchronizationManager.isSynchronizationActive() 为true,活跃事务存在,里面的afterCommit监听不到事务提交,无法执行到。

juejin.cn/post/727676…

afterCompletion里面嵌套afterCompletion

TransactionUtils.afterCompletionSynExecute(()->{
            System.out.println("1");
            TransactionUtils.afterCommitSynExecute(()->{
                System.out.println("2");
            });
            System.out.println("3");
        });
        System.out.println("4");

结果4, 1, 2, 3

afterCompletion执行时,调用了triggerAfterCompletion,TransactionSynchronizationManager.isSynchronizationActive() 为false,活跃事务被清除,里面的afterCommit通过无事务执行。