Atomikos-JTA分布式事务-XA
程序员文章站
2022-05-23 12:55:31
...
本文是一个简单的Atomikos基础例子,Atomikos是JTA的一个实现。
Java事务API(Java Transaction API,简称JTA ) 是一个Java企业版 的应用程序接口,在Java环境中,允许完成跨越多个XA资源的分布式事务. 一个分布式的事务涉及一个事务管理器和一个或者多个资源管理器。一个资源管理器是任何类型的持久性的数据存储。事务管理器负责协调所有事务参与者之间的通信。
Atomikos可以与Web服务容器集成,比如Tomcat。与Tomcat集成时,在spring框架中使用JNDI进行数据源定位。
也可以直接与Spring集成。(不完善,学习中。。。)
与Tomcat集成官方参考:https://www.atomikos.com/Documentation/Tomcat7Integration35
一.所需jar
- transactions.jar
- transactions-api.jar
- transactions-jta.jar
- transactions-jdbc.jar
- atomikos-util.jar.jar
- jta.jar
二.代码
package com.uhuibao.transaction;
import java.sql.Connection;
import java.sql.Statement;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
public class JTATransaction {
public static void main(String[] args) {
System.out.println("Start......");
jtaTransaction();
System.out.println("End......");
}
/**
* @see 创建三个数据库资源
* @see 第一个和第二个同IP不同数据库
* @see 第三个同第一个、第二个不同IP不同数据库
*
*/
public static void jtaTransaction(){
//创建事务管理器
UserTransactionImp utx = new UserTransactionImp();
//创建数据源
AtomikosDataSourceBean adsb1 = new AtomikosDataSourceBean();
//MySQL数据源配置
MysqlXADataSource mzds1 = new MysqlXADataSource();
mzds1.setURL("jdbc:mysql://192.168.0.153:3306/temp?autoReconnect=true");
mzds1.setUser("root");
mzds1.setPassword("mytest");
//定义数据源唯一名称
adsb1.setUniqueResourceName("infodb");
adsb1.setXaDataSource(mzds1);
AtomikosDataSourceBean adsb2 = new AtomikosDataSourceBean();
MysqlXADataSource mzds2 = new MysqlXADataSource();
mzds2.setURL("jdbc:mysql://192.168.0.153:3306/huicloud_info_db?autoReconnect=true");
mzds2.setUser("root");
mzds2.setPassword("mytest");
adsb2.setUniqueResourceName("orderdb");
adsb2.setXaDataSource(mzds2);
AtomikosDataSourceBean adsb3 = new AtomikosDataSourceBean();
MysqlXADataSource mzds3 = new MysqlXADataSource();
mzds3.setURL("jdbc:mysql://192.168.0.49:3306/test?autoReconnect=true");
mzds3.setUser("root");
mzds3.setPassword("[email protected]");
adsb3.setUniqueResourceName("testdb");
adsb3.setXaDataSource(mzds3);
boolean rollback = false;
try {
// 开启事务
utx.begin();
//获取链接
Connection conn1 = adsb1.getConnection();
Statement stmta1 = conn1.createStatement();
stmta1.execute("insert into haha(id,name,sex) values(9,'1','2');");
Connection conn2 = adsb2.getConnection();
Statement stmta2 = conn2.createStatement();
stmta2.execute("insert into tb_promise(promise_id,promise_name,promise_type,promist_status) values(9,'dfsfsdf',1,1);");
Connection conn3 = adsb3.getConnection();
Statement stmta3 = conn3.createStatement();
stmta3.execute("insert into test1(id,class,grade) values(9,'五班','三年级');");
stmta2.close();
conn2.close();
stmta3.close();
conn3.close();
stmta1.close();
conn1.close();
} catch (Exception e) {
e.printStackTrace();
rollback = true;
} finally {
if (!rollback)
try {
//提交
utx.commit();
} catch (IllegalStateException | SecurityException
| RollbackException | HeuristicMixedException
| HeuristicRollbackException | SystemException e) {
e.printStackTrace();
}
else
try {
//回滚
utx.rollback();
} catch (IllegalStateException | SecurityException
| SystemException e) {
e.printStackTrace();
}
}
}
}
上一篇: HTML中meta标签的总结详解
下一篇: Ibatis通用对象封装