`
hpgary
  • 浏览: 81978 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java XA 分布式事务

    博客分类:
  • Java
 
阅读更多

XA分布式事务,很显然是发生在多台db上的,

 

Java XA分布式事务实现如下:

依赖jar包:

<dependency>
			<groupId>com.atomikos</groupId>
			<artifactId>transactions-jdbc</artifactId>
			<version>3.9.3</version>
		</dependency>
		<dependency>
			<groupId>javax.transaction</groupId>
			<artifactId>jta</artifactId>
			<version>1.1</version>
		</dependency>

 

Java 代码如下:

 

import java.sql.Connection;
import java.sql.PreparedStatement;

import javax.sql.XAConnection;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;

import com.atomikos.icatch.jta.UserTransactionManager;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
import com.mysql.jdbc.jdbc2.optional.MysqlXid;

public class DataSourceTools {
	
	protected static MysqlXADataSource getMysqlXADataSource1() {
		MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
		mysqlXADataSource.setURL("jdbc:mysql://127.0.0.1:3306/db1");
		mysqlXADataSource.setUser("root");
		mysqlXADataSource.setPassword("1");
		return mysqlXADataSource;
	}

	protected static MysqlXADataSource getMysqlXADataSource2() {
		MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
		mysqlXADataSource.setURL("jdbc:mysql://127.0.0.1:3306/db2");
		mysqlXADataSource.setUser("root");
		mysqlXADataSource.setPassword("1");
		return mysqlXADataSource;
	}

	public static AtomikosDataSourceBean getXADataSource1() {
		AtomikosDataSourceBean dataSourceBean = new AtomikosDataSourceBean();
		dataSourceBean.setUniqueResourceName("dn1");
		dataSourceBean.setXaDataSource(getMysqlXADataSource1());
		dataSourceBean.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
		return dataSourceBean;
	}

	public static AtomikosDataSourceBean getXADataSource2() {
		AtomikosDataSourceBean dataSourceBean = new AtomikosDataSourceBean();
		dataSourceBean.setUniqueResourceName("dn2");
		dataSourceBean.setXaDataSource(getMysqlXADataSource2());
		/*
		 * Properties xaProperties = new Properties();
		 * xaProperties.setProperty("url",
		 * "jdbc:mysql://10.0.0.104:8066/TESTDB");
		 * xaProperties.setProperty("user", "user");
		 * xaProperties.setProperty("password", "user");
		 * dataSourceBean.setXaProperties(xaProperties);
		 */
		dataSourceBean.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
		return dataSourceBean;
	}

	public static UserTransactionManager getUserTransactionManager() throws Exception {
		return new UserTransactionManager();
	}

	public static void main(String[] args) throws Exception {
		AtomikosDataSourceBean atomikos1 = getXADataSource1() ;
		AtomikosDataSourceBean atomikos2 = getXADataSource2() ;
		XAConnection xaCon1 = atomikos1.getXaDataSource().getXAConnection();
		XAConnection xaCon2 = atomikos2.getXaDataSource().getXAConnection();
		Connection conn1 = xaCon1.getConnection();
		Connection conn2 = xaCon2.getConnection();
		XAResource xaResource1 = xaCon1.getXAResource();
		XAResource xaResource2 = xaCon2.getXAResource();
		Xid xid1 = new MysqlXid(new byte[]{0x01}, new byte[]{0x02} , 0) ;
		Xid xid2 = new MysqlXid(new byte[]{0x01}, new byte[]{0x03}, 0);
		
		try {
			xaResource1.start(xid1, XAResource.TMNOFLAGS);
			PreparedStatement ps1 = conn1.prepareStatement("INSERT INTO tb_role(NAME,available) VALUES('3' , 2)");
			ps1.executeUpdate() ;
			xaResource1.end(xid1, XAResource.TMSUCCESS); 
			
			xaResource2.start(xid2, XAResource.TMNOFLAGS);
			PreparedStatement ps2 = conn2.prepareStatement("INSERT INTO tb_role(NAME,available) VALUES('4' , 1)");
			ps2.executeUpdate() ;
			xaResource2.end(xid2, XAResource.TMSUCCESS);
			
			int prepare1 = xaResource1.prepare( xid1 ) ;
			int prepare2 = xaResource2.prepare( xid2 ) ;
			
			if(prepare1 == XAResource.XA_OK && prepare2 == XAResource.XA_OK){ 
				xaResource1.commit(xid1, false); 
				System.out.println("suc1");  
				xaResource2.commit(xid2, false); 
				System.out.println("suc2");
			}else{
				System.out.println("rollback");
				xaResource1.rollback(xid1); 
				xaResource2.rollback(xid2); 
			}
		} catch (Exception e) {
			e.printStackTrace();
			xaResource1.rollback(xid1); 
			xaResource2.rollback(xid2); 
		}
	}
}

 mysql XA事务写法

mysql> XA START 'xatest';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO mytable (i) VALUES(10);
Query OK, 1 row affected (0.04 sec)

mysql> XA END 'xatest';
Query OK, 0 rows affected (0.00 sec)

mysql> XA PREPARE 'xatest';
Query OK, 0 rows affected (0.00 sec)

mysql> XA COMMIT 'xatest';
Query OK, 0 rows affected (0.00 sec)

 

 

分享到:
评论

相关推荐

    java分布式事务demo

    Java分布式事务是大型分布式系统中不可或缺的一个重要组成部分,它确保在多个网络节点间的数据操作能够保持一致性和完整性。在分布式环境中,由于多个服务之间可能存在数据交互,因此需要一种机制来处理跨服务的数据...

    多数据源动态切换及XA分布式事务Java实现v1.0.zip

    使用Atomikos支持分布式事务,Spring+Mybatis+Druid+AtomikosDataSource 使用手册: https://www.yuque.com/itman/wosfkn/mreame

    java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip

    在分布式事务中,MySQL需要支持XA协议,以便参与全局事务的协调。 5. **Atomikos**: Atomikos是一个开源的JTA(Java Transaction API)实现,它为分布式事务提供了强大的支持。Atomikos可以管理多个数据库和消息...

    分布式事务常用的解决方案,XA,Saga,TCC,MQ补偿.docx

    在分布式事务中,XA、Saga、TCC和MQ补偿等解决方案都可以用于实现分布式事务的一致性和可靠性。每种解决方案都有其特点和优势,选择哪种解决方案取决于具体的业务需求和系统架构。 在 MySQL 中,XA 事务可以通过...

    Seata是一种易于使用高性能基于Java的开源分布式事务解决方案

    4. XA两阶段提交:遵循ACID(原子性、一致性、隔离性和持久性)原则的传统分布式事务模型。Seata也支持这种模式,但在高并发场景下可能存在性能瓶颈。 Seata的设计理念是轻量级和自治,这意味着它尽可能减少对业务...

    分布式事务源代码

    4. **分布式事务API与协议**:如Java的JTA(Java Transaction API)和X/Open XA,它们提供了标准的接口和规范来处理分布式事务。 5. **数据库级别的分布式事务**:例如SQL Server的分布式事务支持,利用MS DTC...

    分布式事务视频教程

    - 某些数据库如MySQL支持XA协议,可以通过中间件如Atomikos、Bitronix等实现分布式事务管理。 4. **自定义补偿逻辑** - 对于某些特定场景,也可以通过编写自定义的补偿逻辑来处理分布式事务。 #### 五、总结 ...

    ejb3.0 分布式事务

    在企业级Java应用中,EJB(Enterprise JavaBeans)3.0提供了一种强大而灵活的方式来处理分布式事务。分布式事务是指跨越多个数据库或资源管理器的单一逻辑操作,确保了数据的一致性和完整性。EJB3.0引入了许多改进,...

    分布式事务分类,xa,at,tcc,sega

    ### 分布式事务基础知识 #### 一、ACID特性与CAP理论 在深入探讨不同分布式事务解决方案之前,我们首先需要理解分布式系统中的两个核心概念——ACID特性和CAP理论。 **ACID特性**: 1. **原子性(Atomicity)**...

    Java 分布式事务(多数据源)

    Java中的`javax.transaction.xa.XAResource`接口就是对这一协议的实现,它提供了在分布式事务中管理资源的方法。 3. **Spring框架的事务管理**:Spring提供了声明式事务管理,允许开发者通过注解或配置文件来控制...

    Java微服务系统分布式事务解决方案.docx

    ### Java微服务系统分布式事务解决方案 #### 一、CAP定理与分布式系统设计原则 **CAP理论**在分布式系统的设计中扮演着至关重要的角色。它指出,在分布式计算环境中,任何共享数据系统都无法同时保证一致性...

    多数据源分布式事务管理调研报告.docx

    - **XA分布式事务协议**:定义了资源管理器(如数据库)与事务管理器之间的接口标准。MySQL 5.0.3及以上版本支持XA事务,InnoDB存储引擎提供支持。 - **Atomikos**:这是一个开源的Java事务管理器,支持JTA(Java ...

    Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务

    本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA(Java Transaction API)分布式事务。 首先,Spring Boot是一个轻量级的框架,它简化了基于Spring的应用程序开发...

    分布式事务专题-v1.1.pdf

    除了传统的分布式事务解决方案外,还有一些基于特定数据库的中间件产品,比如阿里巴巴的Seata,它为分布式事务提供了易用的解决方案,并支持 AT (自动补偿事务)、TCC (Try-Confirm/Cancel)、SAGA 和 XA 模式。...

    分布式事务专题-v1.1

    本专题主要聚焦于Java环境下的分布式事务处理,旨在帮助开发者理解和掌握如何在分布式环境中实现可靠的事务管理。 分布式事务涉及到多个节点之间的协调工作,这些节点可能位于不同的服务器上,甚至跨越多个数据库...

    大规模SOA系统中的分布式事务处理

    本讲义将深入探讨在Java环境下实现大规模SOA系统中的分布式事务处理的关键技术和挑战。 首先,我们需要理解什么是分布式事务。在分布式系统中,事务是跨越多个节点的一系列操作,这些操作要么全部成功,要么全部...

    多数据源分布式事务管理调研报告.zip

    - Seata(前身是Fescar):阿里巴巴开源的分布式事务解决方案,支持AT、TCC、Saga和XA模式,易于集成到Spring Boot项目中。 - Apache ShardingSphere:提供分布式事务解决方案,包括2PC、TCC、Saga和本地事务的...

    基于J2EE分布式事务的应用技术研究

    - **JTA (Java Transaction API)**:定义了事务管理器与分布式事务系统各组件之间的接口。它提供了事务控制的API,并且可以与任何符合J2EE规范的事务管理器协同工作。 - **JTS (Java Transaction Service)**:提供了...

Global site tag (gtag.js) - Google Analytics