关于JTA实现的疑问

09-05-23 spikeme
XA定义分布式事务为:有多个数据源参与的事务,那这个数据源就不一定是数据库的数据源,也有可能来自文件系统,网络流或者本地内存。如果我有如下工作任务:

1 往数据库里插入一条数据

2 将你本地内存中全局状态“总记录数”加一

3 往192.2.11.5这台机器的消息队列中发送一个消息

需要放到一个事务中去处理,我想知道JTA能做到吗?我对JTA不是很熟,看过很多JTA的资料,听说要实现还是比较复杂的。

    

spikeme
2009-05-23 19:20
另外JTA能脱离容器使用吗,因为TOMCAT不支持JTA,如果可以脱离容器使用的话,那在TOMCAT下也可以使用。

banq
2009-05-24 09:46
JTA可以单独使用,只要是组件 部件,就可以单独使用,这是松耦合设计的目标。如果不能,就是臭狗屎,不要用。

JTA是利用资源锁进行串行化单线程操作,如果没有资源所,你可以自己直接使用Java的线程锁。

以上观点如果你不同意,可以不发表任何观点,只是希望帮助你启发思路,不可能一步到位提供你终极解决方案,因为对你需求了解不全面。

[该贴被banq于2009-05-24 09:48修改过]

xmuzyu
2009-05-24 14:09
1 往数据库里插入一条数据

2 将你本地内存中全局状态“总记录数”加一

3 往192.2.11.5这台机器的消息队列中发送一个消息

能不能在同一个事务中要看你的资源有没有提供适配器给JTA管理器。因为事务会设计到一些资源,而这些资源拿你这个例子来说就是DB和JMS,而要想这些资源能让JTA事务管理器管理,就必须提供相应的适配器,所以1如果数据库JDBC驱动(适配器)支持XA标准,那么你的第一点可以做到,第三点如果你用的JMS提供者也提供了JTA适配器的话也可以纳入JTA事务的管理。至于第二点内存中的记录加一,这个如果你也有相应的对内存的适配器也可以实现,但是目前我还没有发现这种适配器。

其实JTA中有个事务性资源的概念,javax.transaction.xa.XAResource的实现类交给JTA事务管理器使用(注意里面有start,end方法等)还有个connection,对于JDBC来说就是支持XA的连接,对于JMS来说就是支持XA的JMS连接。这个事务性资源中的XAResource由JTA事务管理器使用,connection由应用程序使用。

我建议楼主看一下JTA规范,网上很多文字介绍JTA的越看越糊涂。楼主如果看JTA规范肯定会豁然开朗的。

猜你喜欢