Java jta 原理_分布式事务JTA实现Atomikos与Spring集成实践

Atomikos官网无法访问,不过Maven中央库中具atomikos包。Atomikos集成Spring,Hibernate,Mybatis网上文章比较多,本文是通过JavaSE的方式借用Spring配置来测试Atomikos对JTA的实现。

下面做一件事,就是两(+)个数据库,在一个事务里对其分别对数据库操作验证操作的原子性,即要么两个数据库的操作都成功,要么都失败。

1.准备工作

1.1 Maven pom.xml中添加依赖包

atomikos:(目前最新版)

jar依赖图:

850722cd3f93f0750cc2b0d808261305.png

Postgresql数据库驱动:

注:文中使用的是Postgresql V9.2

javax.transaction.transaction-api.1.1:

注:根据需要选择其一即可。

Spring,Junit依赖这里省略。

1.2 创建数据库以及表

数据库分别是:javaee,tomdb

3f09f632a2847d0f7ed9064cddce6933.png

2.在项目中添加配置文件

spring-jta.xml 和transaction.properties(模版见文中附件)文件,spring-jta.xml在src/main/resources/integration下,transaction.properties在src/main/resources/下。

2.1在spring-jta.xml中配置两个XADataSource:

说明:

Postgresql的max_prepared_transactions参数值默认是0,要开启XA需要设置该值至少和max_connections参数值一样大,该参数在PostgreSQL\9.3\data\postgresql.conf文件中。

PGXADataSource的父类BaseDataSource没有url属性,可需要分别设置serverName,portNumber,databaseName等属性。不同的数据库驱动有不同的实现方法。

2.2 配置事务管理对象和UserTransaction接口实现

上面三个Bean可以独立使用来进行事务控制,具体看下面3。

3. 编写测试

3.1 使用atomikosUserTransactionManager对象测试(TestAtomikos1.java)

3.2使用Spring的JtaUserTransactionManager对象测试(TestAtomikos2.java 修改TestAtomikos1.java中的exe方法即可)

3.3使用atomikosUserTransaction Bean对象进行测试(TestAtomikos3.java 修改TestAtomikos1.java中的exe方法即可)

使用上述三种UserTransaction进行测试,其中test1方法是成功执行,test2方法是执行失败的(因为插入的值长度超过的字段长度限制)。通过分析之后,如果分布式事物控制正确,那么数据库中写入的值对于两张不同的表而言,是没有数字值被写入的。如图所示:

53e03070295e56d6e4adb145f5bc8113.png

在测试过程中,经过对比确实达到了分布式事务控制的效果。

整个操作的架构图如下(摘自Atomikos Blog)

28c7a4b350ea15fa78c9280045eef3d8.png

关于JTA原理文章开始提到的那篇文章,写的很详细和清晰,可以细细阅读和理解。

本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1658102,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值