欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();
			}  
                }  
	}
}