LXX的网络日志
人因梦想而伟大
JTA+Atomikos分布式事务源码剖析(四):XA END指令

继续往TransactionAspectSupport.invokeWithinTransaction()方法里面看
在commitTransactionAfterReturning()方法中去提交事务,那就往里面看看

010 (1)

进来commitTransactionAfterReturning()方法后,就是调用了TransactionManager.commit()方法

010 (2)

后面一步步的debug,发现会去执行triggerBeforeCompletion()方法

010 (3)

然后triggerBeforeCompletion()方法里面,会去执行TransactionSynchronizationUtils.triggerBeforeCompletion()方法

010 (4)

然后继续往里面跟,去触发TransactionSynchronization.beforeCompletion()方法

010 (5)

再继续往里面跟的时候,发现走到org.mybatis.spring.SqlSessionUtils.SqlSessionSynchronization#beforeCompletion()方法里面了,也就是mybatis里面的代码了
然后去执行SqlSession.close()方法

010 (6)

后面一步步debug,走到invoke()方法,要去执行close()方法

010 (7)

然后一步步走到这里,要去执行close()方法,那就跟进去看看

010 (8)

进来close()方法后,debug一会,发现主要还是看sessionHandleState.notifySessionClosed()方法

010 (9)

然后要去调用sessionClosed()方法

010 (10)

再跟进state.sessionClosed()方法里面去看看

010 (11)

创建了一个BranchEndedStateHandler,既然如此就进它的构造函数里面

010 (12)

然后再往branch.suspend()方法里面跟

010 (13)

这里要去调用xaresource.end()方法,进去跟

010 (14)

发现这里在构造XA END指令了,核心代码就在这里,下面的dispatchCommand()方法,之前看过,就是把这个构造好的指令发送到数据库去。

010 (15)

所以,发送XA END方法的核心代码所在处就是,com.atomikos.datasource.xa.XAResourceTransaction#suspend()这个。

010 (16)
010 (17)

后面又继续debug了一会,每个库都会来执行com.atomikos.datasource.xa.XAResourceTransaction#suspend()方法,也就是去发送XA END指令。

010 (18)