LXX的网络日志
人因梦想而伟大
JTA+Atomikos分布式事务源码剖析(一):分布式事务的创建

之前分析过Spring框架的事务是如何实现的,就不再多说。

在TransactionAspectSupport中打了一个断点:

然后Debug进入createTransactionIfNecessary()方法

createTransactionIfNecessary.png

进入之后,发现当前的TM为JTA(JtaTransactionManager)

JtaTransactionManager.png

然后继续Debug进入getTransaction()方法

然后一直走,走到了startTransaction()方法

startTransaction01.png

进入startTransaction()方法之后,要去doBegin()方法

startTransaction02.png

进入doBegin()方法后,发现是JtaTransactionManager.doBegin()方法
然后它要去执行doJtaBegin()方法

doBegin.png

进入doJtaBegin()方法之后,看代码的意思,应该是去设置一下隔离级别和超时时间等等

然后再调用下面这行代码,真正的去开启一个事务

txObject.getUserTransaction().begin();

doJtaBegin.png

Debug进入begin()方法,发现是atomikos的代码了

begin01.png

然后Debug走了几步,进入txmgr_.begin()的方法里面了,直到走到这

txmgr_.begin.png

下面这一行代码,它要去获取一个CompositeTransaction
ct = compositeTransactionManager.getCompositeTransaction();

getCompositeTransaction.png

进入getCurrentTx()方法,看代码的意思,就是根据当前的Thread(线程),从threadtotxmap中去获取一个CompositeTransaction(一个分布式事务)

不过debug的时候,获取出来是null,所以啥也没获取到

getCurrentTx.png

debug继续走,然后要去调用下面这行代码

ct = compositeTransactionManager.createCompositeTransaction ( ( ( long ) timeout ) * 1000 );

createCompositeTransaction01.png

进入createCompositeTransaction()方法之后,我debug看了看

其实很简单,就是从getCurrentTx()方法里面去获取一个CompositeTransaction,不过没有

然后就会调用ret = getTransactionService().createCompositeTransaction ( timeout ),这行代码就是去创建了一个CompositeTransaction,不过目前只是初步分析,就不深入的去看里面怎么创建的了

最后再去执行setThreadMappings ( ret, thread ),这行代码

createCompositeTransaction02.png

setThreadMappings()方法,看代码的意思,就是将创建出来的CompositeTransaction,给放到map里面

setThreadMappings.png

然后继续debug,走到这行代码

recreateCompositeTransactionAsJtaTransaction01.png

进去recreateCompositeTransactionAsJtaTransaction()方法,结合代码和方法名,看意思是将这个分布式事务创建为Jta事务

recreateCompositeTransactionAsJtaTransaction02.png

创建完事务之后,也就是执行完createTransactionIfNecessary()方法里面的逻辑之后

就会去执行retVal = invocation.proceedWithInvocation(),这行代码,这里就是去执行service里面的代码了,执行业务逻辑操作数据库等等

createTransactionIfNecessary02.png

到目前为止,创建一个分布式事务的代码可以说是分析完了,大致知道是怎么回事,怎么去创建的。

MySQL中使用XA事务的语法,可以查看一下XA Transaction SQL Statements

使用JDBC来创建XA事务的代码这里就不弄了,可以上网查查。

Atomikos框架,弄了一个DataSource,AtomikosDataSourceBean。从这里获取Connection的时候,一定会获取一个Atomikos包装过的Connection,只有这样Atomikos框架才可以帮我们来控制分布式事务的执行。

画图理解下,此次分析源码的过程:

图