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监听不到事务提交,无法执行到。
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通过无事务执行。