TransactionSynchronizationManager事务管理

133 阅读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();
        }
    }

不支持嵌套以及原理

TransactionSynchronizationManager.isSynchronizationActive()  // 该方法并不会

只是判断改管理器中是否有活跃事务

public static boolean isSynchronizationActive() {
        return (synchronizations.get() != null);
    }

但是在afterCompletion回调之后在会把这个活跃事务清除

private void triggerAfterCompletion(DefaultTransactionStatus status, int completionStatus) {
        if (status.isNewSynchronization()) {
            List<TransactionSynchronization> synchronizations = TransactionSynchronizationManager.getSynchronizations();
            TransactionSynchronizationManager.clearSynchronization();
            if (!status.hasTransaction() || status.isNewTransaction()) {
                // No transaction or new transaction for the current scope ->
                // invoke the afterCompletion callbacks immediately
                invokeAfterCompletion(synchronizations, completionStatus);
            }
            else if (!synchronizations.isEmpty()) {
                // Existing transaction that we participate in, controlled outside
                // the scope of this Spring transaction manager -> try to register
                // an afterCompletion callback with the existing (JTA) transaction.
                registerAfterCompletionWithExistingTransaction(status.getTransaction(), synchronizations);
            }
        }
    }

嵌套

 TransactionalUtils.afterCommitExecute(()->{
            System.out.println(1);
            TransactionalUtils.afterCommitExecute(()->{
                System.out.println("2");
            });
        });

这样里面的监听回调就一直无法成功,执行不到。

blog.csdn.net/wang4896870…

私有方法不行

 private void test02() {
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            String currentTransactionName = TransactionSynchronizationManager.getCurrentTransactionName();
            System.out.println(currentTransactionName);
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCompletion(int status) {
                    System.out.println(status);
                }
​
                @Override
                public void afterCommit() {
                    boolean synchronizationActive = TransactionSynchronizationManager.isSynchronizationActive();
                    System.out.println(synchronizationActive);
​
                }
            });
        } else {
            System.out.println("000000000000000000000000");
        }
    }

代理对象访问不了这个私有回调方法 afterCommitafterCompletion