什么是XA?

看百科:XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器接口标准。Oracle、Informix、DB2和Sybase等各大数据库厂家都提供对XA的支持。XA协议采用两阶段提交方式来管理分布式事务。XA接口提供资源管理器与事务管理器之间进行通信的标准接口。

  • 资源管理器(RM):就是一种存储数据的服务,例如Mysql和Oracle。
  • 事务管理器(TM):在分布式系统中,每个系统的有自己单独的本地事务,如何让这些事务组成一个完整的事务?这就是事务管理器要干的事情,保证所有事务要么全部成功,要么全部失败。

XA就定义了资源管理器和事务管理器通信的规范:

  1. prepare:预提交,当各个资源管理器执行完数据操作后,事务管理器会发起预提交,询问每个资源管理器是否能提交数据。
  2. commit/rollback:提交/回滚。事务管理器会收集所有的资源管理器的响应,如果有全部成功则通知所有的RM提交,有失败的则通知所有RM回滚。

怎么使用XA?

以Java Mysql操作为例。Mysql的mysql-connector-java已经实现了XA接口。
看下下面例子:

public class MysqlXADemo {public static void main(String[] args) throws SQLException {//true表示打印XA语句,,用于调试boolean logXaCommands = true;// 获得资源管理器操作接口实例 RM1Connection conn1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_user", "root", "root");XAConnection xaConn1 = new MysqlXAConnection((com.mysql.jdbc.Connection) conn1, logXaCommands);XAResource rm1 = xaConn1.getXAResource();// 获得资源管理器操作接口实例 RM2Connection conn2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_account", "root", "root");XAConnection xaConn2 = new MysqlXAConnection((com.mysql.jdbc.Connection) conn2, logXaCommands);XAResource rm2 = xaConn2.getXAResource();// AP请求TM执行一个分布式事务,TM生成全局事务idbyte[] gtrid = "g12345".getBytes();int formatId = 1;try {// ==============分别执行RM1和RM2上的事务分支====================// TM生成rm1上的事务分支idbyte[] bqual1 = "b00001".getBytes();Xid xid1 = new MysqlXid(gtrid, bqual1, formatId);// 执行rm1上的事务分支rm1.start(xid1, XAResource.TMNOFLAGS);//One of TMNOFLAGS, TMJOIN, or TMRESUME.PreparedStatement ps1 = conn1.prepareStatement("INSERT into user(name) VALUES ('Fox')");ps1.execute();rm1.end(xid1, XAResource.TMSUCCESS);// TM生成rm2上的事务分支idbyte[] bqual2 = "b00002".getBytes();Xid xid2 = new MysqlXid(gtrid, bqual2, formatId);// 执行rm2上的事务分支rm2.start(xid2, XAResource.TMNOFLAGS);PreparedStatement ps2 = conn2.prepareStatement("INSERT into account(user_id,money) VALUES (1,10000000)");ps2.execute();rm2.end(xid2, XAResource.TMSUCCESS);// ===================两阶段提交================================// phase1:询问所有的RM 准备提交事务分支int rm1_prepare = rm1.prepare(xid1);int rm2_prepare = rm2.prepare(xid2);// phase2:提交所有事务分支boolean onePhase = false;//TM判断有2个事务分支,所以不能优化为一阶段提交if (rm1_prepare == XAResource.XA_OK&& rm2_prepare == XAResource.XA_OK) {//所有事务分支都prepare成功,提交所有事务分支rm1.commit(xid1, onePhase);rm2.commit(xid2, onePhase);} else {//如果有事务分支没有成功,则回滚rm1.rollback(xid1);rm2.rollback(xid2);}} catch (XAException e) {// 如果出现异常,也要进行回滚e.printStackTrace();}}
}

在上面代码中,MysqlXADemo充当了TM角色,rm1和rm2都执行成功则全部提交,否则则回滚。

XA模式框架:Atomikos

Atomikos是一款开源类事务管理器,提供XA模式分布式事务管理功能。其具体实现也是对mysql jdbc的XA实现的封装,使其使用更加简单便捷。

public class AtomikosDemo {private static AtomikosDataSourceBean createAtomikosDataSourceBean(String dbName) {// 连接池基本属性Properties p = new Properties();p.setProperty("url", "jdbc:mysql://localhost:3306/" + dbName);p.setProperty("user", "root");p.setProperty("password", "root");// 使用AtomikosDataSourceBean封装com.mysql.jdbc.jdbc2.optional.MysqlXADataSourceAtomikosDataSourceBean ds = new AtomikosDataSourceBean();//设置resourceName 唯一ds.setUniqueResourceName(dbName);ds.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");ds.setXaProperties(p);return ds;}public static void main(String[] args) {AtomikosDataSourceBean ds1 = createAtomikosDataSourceBean("db_user");AtomikosDataSourceBean ds2 = createAtomikosDataSourceBean("db_account");Connection conn1 = null;Connection conn2 = null;PreparedStatement ps1 = null;PreparedStatement ps2 = null;UserTransaction userTransaction = new UserTransactionImp();try {// 开启事务userTransaction.begin();// 执行db1上的sqlconn1 = ds1.getConnection();ps1 = conn1.prepareStatement("INSERT into user(name) VALUES (?)", Statement.RETURN_GENERATED_KEYS);ps1.setString(1, "Fox");ps1.executeUpdate();ResultSet generatedKeys = ps1.getGeneratedKeys();int userId = -1;while (generatedKeys.next()) {// 获得自动生成的userIduserId = generatedKeys.getInt(1);}// 模拟异常 ,直接进入catch代码块,2个都不会提交//int i=1/0;// 执行db2上的sqlconn2 = ds2.getConnection();ps2 = conn2.prepareStatement("INSERT into account(user_id,money) VALUES (?,?)");ps2.setInt(1, userId);ps2.setDouble(2, 10000000);ps2.executeUpdate();// 两阶段提交userTransaction.commit();} catch (Exception e) {try {e.printStackTrace();userTransaction.rollback();} catch (SystemException e1) {e1.printStackTrace();}} finally {try {ps1.close();ps2.close();conn1.close();conn2.close();ds1.close();ds2.close();} catch (Exception ignore) {}}}
}

通过代码理解分布式事务:XA模式相关推荐

  1. 6 张图带你彻底搞懂分布式事务 XA 模式

    作者 | 朱晋君 来源 | 阿里巴巴云原生公众号 XA 协议是由 X/Open 组织提出的分布式事务处理规范,主要定义了事务管理器 TM 和局部资源管理器 RM 之间的接口.目前主流的数据库,比如 o ...

  2. 《深入理解分布式事务》第七章 XA 强一致性分布式事务原理

    <深入理解分布式事务>第七章 XA 强一致性分布式事务原理 文章目录 <深入理解分布式事务>第七章 XA 强一致性分布式事务原理 一.X/Open DTP 模型与 XA 规范 ...

  3. ShardingSphere RAW JDBC 分布式事务XA 代码示例

    ShardingSphere RAW JDBC 分布式事务XA 代码示例 项目工程在:transaction-2pc-xa-raw-jdbc-example 代码简介     基于ShardingSp ...

  4. 带你深入理解分布式事务,掌握后台分布式核心技术,PS:送5本!

    大家好,首先感谢大家对极客重生的长期支持.有了大家的认可和鼓励才有动力陆陆续续肝出了这么多文章.为了表示对大伙儿的感谢,今天我和冰河大佬要了5本纸质书,免费送出. 送书的规则是在评论区留言,截止到今天 ...

  5. 还不理解“分布式事务”?这篇给你讲清楚!

    " 这篇文章将介绍什么是分布式事务,分布式事务解决什么问题,对分布式事务实现的难点,解决思路,不同场景下方案的选择,通过图解的方式进行梳理.总结和比较. 相信耐心看完这篇文章,谈到分布式事务 ...

  6. 《深入理解分布式事务》第六章 最终一致性分布式事务解决方案

    <深入理解分布式事务>第六章 最终一致性分布式事务解决方案 文章目录 <深入理解分布式事务>第六章 最终一致性分布式事务解决方案 一.最终一致性分布式事务概述 1.典型方案 2 ...

  7. 《深入理解分布式事务》第二章 MySQL 事务的实现原理

    shua# <深入理解分布式事务>第二章 MySQL 事务的实现原理 文章目录 一.Redo Log 1.Redo Log 基本概念 2.Redo Log 基本原理 3.Redo Log ...

  8. dubbo调用超时回滚_微服务痛点基于Dubbo + Seata的分布式事务(AT模式)

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

  9. 来!带你深入理解分布式事务:原理与实战!

    随着互联网的不断发展,互联网企业的业务在飞速变化,推动着系统架构也在不断地发生变化.总体来说,系统架构大致经历了 单体应用架构→垂直应用架构→分布式架构→SOA架构→微服务架构的演变. 如今微服务技术 ...

最新文章

  1. [原创]Maven实战-读书笔记
  2. [翻译]欢迎使用C#9.0
  3. qt4.8 mysql 驱动_Qt-4.8.5配置mysql驱动
  4. vector clone_Java Vector clone()方法与示例
  5. 老外看中国:本土移动应用差异在哪?
  6. 软件测试中英文词汇对照表
  7. NFS客户端挂载目录后无写入权限的解决方案
  8. HDU5695 Gym Class【拓扑排序】
  9. MySQL 主主同步配置和主从配置步骤
  10. Google Maps API 进级:GoogleMaps中显示画中画
  11. Atitit.Atiposter 发帖机 信息发布器 v7 q516
  12. 和cesuim类似的三维GIS平台_绿城南宁,火红的三维GIS
  13. 数据治理标准体系框架
  14. [转]中国古代兵事纵横谈[强文]
  15. 无法解析域名“mirrors.ustc.edu.cn
  16. 建模学习—带你轻松认识并掌握3Dmax
  17. 谁对云服务器安全负责:客户还是供应商 ?
  18. 服务器调用打印机进行文档打印,云服务器怎么调用本地打印机
  19. (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  20. 2020全国专业技术人员计算机,关于2020年全国专业技术人员计算机应用能力考试考务工作有关问题的通知...

热门文章

  1. Android MotionEvent 之ACTION_CANCEL
  2. 北京市公建民营养老机构市场分析报告
  3. setInterval读取外部变量
  4. vue props type设置多个类型,默认值
  5. BSpline曲线逼近
  6. 【操作系统 进程调度】
  7. CentOS计划任务的用法
  8. Qt-消息对话框的设计
  9. 计算共形几何是计算机科学和,科学网—计算共形几何概览 - 顾险峰的博文
  10. Markdown Rreview Enhanced