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)
相关推荐
使用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 ## 功能特性 1. 开箱即用,不需要重构原有项目的代码,与mysql事务写法一致,简单易用。 2. 两段提交的强一致性事务,高并发下,支持读已提交的事务隔离...
在写之前先来了解一下,分布式事务的一些解决方案。 现目前处理分布式事务的方案有很多,比如 基于 XA 协议的方案 基于业务逻辑的 TCC 协议方案 基于 SAGA 协议的方案 而实现了对应的协议的有 在 Java 中基于 XA ...
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。在 Seata 开源之前,Seata 对应的...
Xa测试 分布式事务测试工程
介绍Rabbitmg用于解决分布式事务必须掌握的5个核心概念一款分布式消息中间件,基于erlang语言开发,具备语言级别的高并发处理能力。和Spring框架是同一家公司。支持持久化、高可用1.Queue:真正存储数据的地方2....
XAPool是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。
spring+mybatis+atomikos,java分布式事务。 由于网上的多数据源事务的帖子大多是2010年以前的,现在spring都已经到4.X了,有些类已经弃用了。 原先很多都是用jotm实现的,但是由于spring的升级,totm的本地化实例...
JMay是什么JMay是一款基于Spring、SpringMVC、Mybatis、Atomikos集成框架,用于快速搭建跨数据库、分布式事务(XA规范)支持的Java web项目.JMay有哪些功能1.基于spring,如沐春风的体验;2.扩展Mybatis-Generator,...
ByteJTA是基于XA / 2PC机制的分布式事务管理器的实现。 ByteJTA与JTA兼容,并且可以与Spring和其他Java容器无缝集成。 1.快速入门 1.1添加Maven依赖 1.1.1。 春云 < groupId>org.bytesoft < artifactId>bytejta-...
jta Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务 问题一:Druid 和 Mysql 版本的问题 问题二:Springtest 默认情况下事务回滚 Mysql对XA协议支持不好,有待看
LIXA(LIbre XA)是一个开源的免费事务管理器,根据X / Open CAE规范实现了分布式事务处理“ XA规范”和“ TX(事务划分)规范”。 LIXA甚至实现了XTA:XA事务API,这是一种创新的API,它实现了在不同应用程序之间...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...
github下载太慢了,最新官方 1.5.1 ...Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
高可靠性:支持分布式场景下的异常事务回滚,以及随着时间的推移异常恢复,以防止事务中止 可用性:提供零侵入性Spring-Boot和Spring-Namespace以与业务系统快速集成 高性能:分散式设计,与业务系统完全集成,自然...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 基于支持本地 ACID 事务的关系型...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...