LXX的网络日志
人因梦想而伟大
JTA+Atmikos分布式事务源码剖析(三):XA START指令以及SQL准备

发送一个请求,操作数据库的时候,进来了AtomikosConnectionProxy.invoke()方法
然后要调用getAutoCommit()方法

009_01

然后一直下一步,就走到这里来了,最终返回了一个true

这里应该调用的是Connection.getAutoCommit(),直接走了底层的真是的数据库连接,获取到的结果就是true。

009_02

然后第二次,又进来invoke()方法,这回的methodName是prepareStatement
args,也就是执行的sql语句

也就是要来找Connection来执行prepareStatement()方法

009_03

一步步执行,然后进来到这里来了

009_04

ENLISTMENT_METHODS里面,只要是createStatement、prepareStatement、prepareCall

009_05

enlist()方法里面,获取了一个CompositeTransactionManager
然后获取CompositeTransaction,接着去调用SessionHandleState.notifyBeforeUse()方法

009_06

然后进来notifyBeforeUse()方法

009_07

然后这个b对象,里面JdbcTransactionResource和MysqlXAConnection

009_08

然后又走了几步,准备去执行checkEnlistBeforeUse()方法

009_09

然后进来checkEnlistBeforeUse()方法
他这里准备调用state.checkEnlistBeforeUse方法,来获取一个TransactionContextStateHandler

009_10

这里面就是创建了一个BranchEnlistedStateHandler

009_11

在BranchEnlistedStateHandler的构造函数里面调用,resource.getResourceTransaction()方法获得一个branch,然后就是调用branch.sertXAResource()方法

最后再去执行branch.resume()方法

009_12

跟进来resume()方法后,发现有去调用xaresource.start()方法

009_13

进去之后发现,创建了一个XA START指令,核心代码就在这

009_14

然后去调用dispatchCommand()方法,这里就是将这个XA START指令发送给数据库了

009_15

然后继续走,这里method.invoke()方法,就是去执行Connection.prepareStatement()方法

009_16

一步步调试,终于找到了XA START指令创建的地方,就是在com.atomikos.datasource.xa.XAResourceTransaction#resume()方法中。

009_17