`
hpgary
  • 浏览: 78682 次
  • 性别: 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)

 

 

分享到:
评论

相关推荐

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

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

    分布式事务解决方案「手写代码」视频教程

    分布式事务解决方案「手写代码」,完整版视频教程下载。 课程大纲 1.基础概念:了解事务的ACID、CAP理论、BASE理论,为分布式方案打基础 2.2PC/3PC:通过2PC演化各种方案:XA方案、JTA、LCN、Seata 3.TCC:TCC不依赖...

    浅谈常用的分布式事务选型

    1、通用分布式事务规范XA 2、JAVA分布式事务规范(JTA) 3、常用的分布式事务框架: 2PC/3PC(强一致性事务) TCC(事务补偿) MQ(消息事务) Seata(柔性事务) Saga

    基于分布式事务RT模式实现适用于hyperf框架的组件源码.zip

    基于分布式事务RT模式实现适用于hyperf框架的组件源码.zip ## 功能特性 1. 开箱即用,不需要重构原有项目的代码,与mysql事务写法一致,简单易用。 2. 两段提交的强一致性事务,高并发下,支持读已提交的事务隔离...

    Java版水果管理系统源码-RTranscation:采用XA、TCC等处理分布式事务

    在写之前先来了解一下,分布式事务的一些解决方案。 现目前处理分布式事务的方案有很多,比如 基于 XA 协议的方案 基于业务逻辑的 TCC 协议方案 基于 SAGA 协议的方案 而实现了对应的协议的有 在 Java 中基于 XA ...

    Spring Cloud Alibaba Seata实现分布式事务

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。在 Seata 开源之前,Seata 对应的...

    xa-test:分布式事务XA协议:Atomikos

    Xa测试 分布式事务测试工程

    基于RabbitMQ消息队列的分布式事务解决方案

    介绍Rabbitmg用于解决分布式事务必须掌握的5个核心概念一款分布式消息中间件,基于erlang语言开发,具备语言级别的高并发处理能力。和Spring框架是同一家公司。支持持久化、高可用1.Queue:真正存储数据的地方2....

    JTA 分布式事务 XAPool 1.5和1.6的所有jar包,源码包

    XAPool是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。

    spring 多数据源事务案例

    spring+mybatis+atomikos,java分布式事务。 由于网上的多数据源事务的帖子大多是2010年以前的,现在spring都已经到4.X了,有些类已经弃用了。 原先很多都是用jotm实现的,但是由于spring的升级,totm的本地化实例...

    JMay:JMay是一款基于Spring、SpringMVC、Mybatis、Atomikos集成框架,用于快速搭建跨数据库、分布式事务(JTA)支持的java web项目

    JMay是什么JMay是一款基于Spring、SpringMVC、Mybatis、Atomikos集成框架,用于快速搭建跨数据库、分布式事务(XA规范)支持的Java web项目.JMay有哪些功能1.基于spring,如沐春风的体验;2.扩展Mybatis-Generator,...

    ByteJTA:ByteJTA是基于XA2PC机制的分布式事务管理器。 它与JTA规范兼容。 用户指南

    ByteJTA是基于XA / 2PC机制的分布式事务管理器的实现。 ByteJTA与JTA兼容,并且可以与Spring和其他Java容器无缝集成。 1.快速入门 1.1添加Maven依赖 1.1.1。 春云 &lt; groupId&gt;org.bytesoft &lt; artifactId&gt;bytejta-...

    jta:Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务

    jta Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务 问题一:Druid 和 Mysql 版本的问题 问题二:Springtest 默认情况下事务回滚 Mysql对XA协议支持不好,有待看

    lixa:LIXA,LIbre XA,是一个免费的开源XA事务管理器-开源

    LIXA(LIbre XA)是一个开源的免费事务管理器,根据X / Open CAE规范实现了分布式事务处理“ XA规范”和“ TX(事务划分)规范”。 LIXA甚至实现了XTA:XA事务API,这是一种创新的API,它实现了在不同应用程序之间...

    JAVA_API1.6文档(中文)

    javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...

    seata server 1.5.1

    github下载太慢了,最新官方 1.5.1 ...Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

    hmily:分布式事务解决方案

    高可靠性:支持分布式场景下的异常事务回滚,以及随着时间的推移异常恢复,以防止事务中止 可用性:提供零侵入性Spring-Boot和Spring-Namespace以与业务系统快速集成 高性能:分散式设计,与业务系统完全集成,自然...

    Java 1.6 API 中文 New

    javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...

    seata-server-1.1.0.zip

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 基于支持本地 ACID 事务的关系型...

    JavaAPI1.6中文chm文档 part1

    javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...

Global site tag (gtag.js) - Google Analytics