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");
});
});
这样里面的监听回调就一直无法成功,执行不到。
私有方法不行
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");
}
}
代理对象访问不了这个私有回调方法 afterCommit 、 afterCompletion