继续往TransactionAspectSupport.invokeWithinTransaction()方法里面看
在commitTransactionAfterReturning()方法中去提交事务,那就往里面看看
进来commitTransactionAfterReturning()方法后,就是调用了TransactionManager.commit()方法
后面一步步的debug,发现会去执行triggerBeforeCompletion()方法
然后triggerBeforeCompletion()方法里面,会去执行TransactionSynchronizationUtils.triggerBeforeCompletion()方法
然后继续往里面跟,去触发TransactionSynchronization.beforeCompletion()方法
再继续往里面跟的时候,发现走到org.mybatis.spring.SqlSessionUtils.SqlSessionSynchronization#beforeCompletion()方法里面了,也就是mybatis里面的代码了
然后去执行SqlSession.close()方法
后面一步步debug,走到invoke()方法,要去执行close()方法
然后一步步走到这里,要去执行close()方法,那就跟进去看看
进来close()方法后,debug一会,发现主要还是看sessionHandleState.notifySessionClosed()方法
然后要去调用sessionClosed()方法
再跟进state.sessionClosed()方法里面去看看
创建了一个BranchEndedStateHandler,既然如此就进它的构造函数里面
然后再往branch.suspend()方法里面跟
这里要去调用xaresource.end()方法,进去跟
发现这里在构造XA END指令了,核心代码就在这里,下面的dispatchCommand()方法,之前看过,就是把这个构造好的指令发送到数据库去。
所以,发送XA END方法的核心代码所在处就是,com.atomikos.datasource.xa.XAResourceTransaction#suspend()这个。
后面又继续debug了一会,每个库都会来执行com.atomikos.datasource.xa.XAResourceTransaction#suspend()方法,也就是去发送XA END指令。