mysql-Java手写分布式事物提交流程

准备

innodb存储引擎开启支持分布式事务

set global innodb_support_ax=on

分布式的流程

详细流程:

  1. XA START ‘a’;
    作用:开始一个新的XA事务,并分配一个唯一的事务ID ‘a’。
    说明:在这个命令之后,所有后续的SQL操作都会被包含在这个XA事务中,直到遇到XA END命令。
  2. insert into z(a,b,c) select 100,2,100;
    作用:执行一条插入语句,将值(100, 2, 100)插入到表z中。
    说明:这条语句是在XA事务上下文中执行的,这意味着如果最终XA事务没有成功提交,这个插入操作也不会对数据库产生实际影响。
  3. XA END ‘a’;
    作用:标记XA事务’a’的操作结束。
    说明:这并不意味着事务已经完成或提交,它只是表明当前事务不再接受新的操作。在XA END之后,不能再对该事务进行任何修改操作。
  4. 进行二阶段
    4. 1 XA PREPARE ‘a’;
    作用:准备XA事务’a’,使其进入预备状态。
    说明:这是两阶段提交(2PC, Two-Phase Commit)的第一阶段。在这个阶段,所有参与的资源管理器会投票决定是否可以安全地提交该事务。如果所有参与者都准备好提交,则可以进入下一阶段;如果有任何一个参与者不能准备好,则整个事务会被回滚。
    4.2 XA COMMIT ‘a’;
    作用:提交XA事务’a’。
    说明:这是两阶段提交的第二阶段。只有当所有参与的资源管理器都已准备好(通过XA PREPARE),并且没有 任何错误发生时,才会执行此命令。提交后,所有更改将永久保存到数据库中。

代码实例

引入依赖:

 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>  <!-- 请使用最新的版本 --></dependency>

1.事务ID标识类

package org.example.xa;import javax.transaction.xa.Xid;public class MyXid implements Xid {private int formatId;private byte gtrid[];private byte bqual[];public MyXid(int formatId, byte gtrid[], byte bqual[]){this.formatId = formatId;this.gtrid = gtrid;this.bqual = bqual;}@Overridepublic int getFormatId() {return formatId;}@Overridepublic byte[] getGlobalTransactionId() {return gtrid;}@Overridepublic byte[] getBranchQualifier() {return bqual;}
}

2.定义获取分布式事务数据源类

package org.example.xa;import com.mysql.cj.jdbc.MysqlXADataSource;public class GetDataSource {private String connString;private String user;private String password;public GetDataSource(String connString, String user, String password) {this.connString = connString;this.user = user;this.password = password;}public MysqlXADataSource getDataSource(){MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();mysqlXADataSource.setURL(connString);mysqlXADataSource.setUser(user);mysqlXADataSource.setPassword(password);return mysqlXADataSource;}
}
  1. XATest测试类
package org.example.xa;import com.mysql.cj.jdbc.MysqlXADataSource;
import javax.sql.XAConnection;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;public class XATest {public static void main(String[] args) throws SQLException, XAException {GetDataSource getDataSource1 = new GetDataSource("jdbc:mysql://localhost:3306/test", "root", "123456");MysqlXADataSource dataSource1 = getDataSource1.getDataSource();GetDataSource getDataSource2 = new GetDataSource("jdbc:mysql://localhost:3306/test", "root", "123456");MysqlXADataSource dataSource2 = getDataSource2.getDataSource();//创建分布式事务的资源管理器XAConnection xaConnection1 = dataSource1.getXAConnection();XAResource xaResource1 = xaConnection1.getXAResource();Connection connection1 = xaConnection1.getConnection();Statement statement1 = connection1.createStatement();MyXid myXid1 = new MyXid(100, new byte[]{0x61,0x61,0x61}, new byte[]{0x61,0x61,0x61});//创建分布式事务的资源管理器XAConnection xaConnection2 = dataSource2.getXAConnection();XAResource xaResource2 = xaConnection2.getXAResource();Connection connection2 = xaConnection2.getConnection();Statement statement2 = connection2.createStatement();MyXid myXid2 = new MyXid(100, new byte[]{0x62,0x62,0x62}, new byte[]{0x62,0x62,0x62});//         xaResource2.rollback(new MyXid(100, new byte[]{0x11}, new byte[]{0x12}));//1.开始一个新的XA事务 在这个命令之后,所有后续的SQL操作都会被包含在这个XA事务中,直到遇到XA END命令xaResource1.start(myXid1, XAResource.TMNOFLAGS);//2.执行DMLstatement1.execute("insert into z(`a`,`b`,`c`) select  2800,2,2800");//3.分布式事务的end,这并不意味着事务已经完成或提交,它只是表明当前事务不再接受新的操作。在XA END之后,不能再对该事务进行任何修改操作。xaResource1.end(myXid1, XAResource.TMSUCCESS);xaResource2.start(myXid2, XAResource.TMNOFLAGS);statement2.execute("insert into z(`a`,`b`,`c`) select 2900,2,2900");xaResource2.end(myXid2, XAResource.TMSUCCESS);//1.分布式的二阶段步骤try{//1.1分布式事务的prepare阶段int re1 = xaResource1.prepare(myXid1);int re2 = xaResource2.prepare(myXid2);//1.2分布式事务的commit或者rollback阶段if(XAResource.XA_OK != re1 || XAResource.XA_OK != re2){xaResource1.rollback(myXid1);xaResource2.rollback(myXid2);}xaResource1.commit(myXid1, false);xaResource2.commit(myXid2, false);}catch (Throwable throwable){xaResource1.rollback(myXid1);xaResource2.rollback(myXid2);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法练习:19.JZ29 顺时针打印矩阵

错误原因 总体思路有&#xff0c;但不够清晰&#xff0c;一直在边调试边完善。这方面就养成更好的构思习惯&#xff0c;以及涨涨经验吧。 分析&#xff1a; 思路&#xff1a;找规律 两个坑&#xff1a; 一次循环的后半段是倒着遍历的是矩阵不是方阵&#xff0c;要考虑行列…

计算机组成与体系结构:缓存设计概述(Cache Design Overview)

目录 Block Placement&#xff08;块放置&#xff09; Block Identification&#xff08;块识别&#xff09; Block Replacement&#xff08;块替换&#xff09; Write Strategy&#xff08;写策略&#xff09; 总结&#xff1a; 高速缓存设计包括四个基础核心概念&#xf…

Tomcat多应用部署与静态资源路径问题全解指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

Python----目标检测(labelimg和labelme的安装与使用,Pycharm配置教程)

一、labelimg labelimg是一款开源的图像标注工具&#xff0c;标签可用于分类和目标检测&#xff0c;它是用python写的&#xff0c;并使用Qt作为其图形界面&#xff0c;简单好用&#xff08;虽然是英文版的&#xff09;。其注释以 PASCAL VOC格式保存为XML文件&#xff0c;这是I…

Vue项目部署服务器

Vue项目部署服务器 目录 Vue项目部署服务器环境配置nginx开放端口打包vue项目配置nginx 环境 vue 2.6.14 nginx 1.26.0配置nginx 准备一个服务器实例 安装nginx所需依赖 yum -y install pcre* yum -y install openssl*下载wget yum install wget下载nginx到/usr/local cd…

spring框架中的本地缓存:spring cache基本使用

基本概念及原理 处理逻辑 Spring Cache 是 Spring 提供的一整套的缓存解决方案。 虽然它本身并没有提供缓存的实现&#xff0c;但是它提供了一整套的接口和代码规范、配置、注解等&#xff0c;这样它就可以整合各种缓存方案了 处理逻辑&#xff1a;每次调用某方法&#xff…

AI大模型学习二十四、实践QEMU-KVM 虚拟化:ubuntu server 25.04 下云镜像创建Ubuntu 虚拟机

一、说明 虽然说大部分的场合&#xff0c;docker都能解决问题&#xff0c;但是有些大型的软件安装时如果修改配置会很麻烦&#xff0c;比方说前面遇到的code-server和dify 默认都是80和443端口要使用&#xff0c;安装在一起就会端口冲突&#xff0c;通过该端口来解决问题&#…

安卓中0dp和match_parent区别

安卓中的 0dp 和 match_parent 的区别&#xff1f; 第一章 前言 有段时间&#xff0c;看到同事在编写代码的时候&#xff0c;写到的是 0dp 有时候自己写代码的时候&#xff0c;编写的是 match_parent 发现有时候效果很类似。 后来通过一个需求案例&#xff0c;才发现两者有着…

二十、案例特训专题3【系统设计篇】web架构设计

一、前言 二、内容提要 三、单机到应用与数据分离 四、集群与负载均衡 五、集群与有状态无状态服务 六、ORM 七、数据库读写分离 八、数据库缓存Memcache与Redis 九、Redis数据分片 哈希分片如果新增分片会很麻烦&#xff0c;需要把之前数据取出来再哈希除模 一致性哈希分片是…

基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(一)

前置说明 开发语言&#xff1a;Rust Web框架&#xff1a;Rocket 数据库&#xff1a;PostgreSQL 开发步骤 新建项目&#xff1a; cargo new projectname 在Cargo.toml文件里配置如下依赖&#xff1a; [dependencies] rocket {version"0.5.0",features["json&qu…

中国城市间交通驾车距离矩阵(2024)

中国城市间交通驾车距离矩阵(2024) 1852 数据简介 中国城市中心的交通驾车距离&#xff0c;该数据为通过审图号GS(2024)0650的中国城市地图得其城市中心距离&#xff0c;再通过高德地图api计算得出其交通驾车最短距离矩阵&#xff0c;单位为KM&#xff0c;方便大家研究使用。…

MySQL替换瀚高数据库报错: TO_DAYS()不存在(APP)

文章目录 环境症状问题原因解决方案报错编码 环境 系统平台&#xff1a;中标麒麟&#xff08;海光&#xff09;7,中标麒麟&#xff08;飞腾&#xff09;7 版本&#xff1a;4.5 症状 MySQL替换为瀚高数据库进行应用系统适配报错&#xff1a;TO_DAYS&#xff08;&#xff09;不…

驱动-Linux定时-timer_list

了解内核定时相关基础知识 文章目录 简要介绍timer_list 特点API 函数实验测试程序 - timer_mod.c编译文件-Makefile实验验证 注意事项总结 简要介绍 硬件为内核提供了一个系统定时器来计算流逝的时间&#xff08;即基于未来时间点的计时方式&#xff0c; 以当前时刻为计时开始…

计算机网络概要

⽹络相关基础知识 协议 两设备之间使⽤光电信号传输信息数据 要想传递不同信息 那么⼆者ᳵ就需要约定好的数据格式 层 封装 继承 多态是计算机的性质 它们⽀持了软硬件分层的实现 同层协议可以ᳵ接通信 同层协议ᳵ不直接通信 是各⾃调⽤下层提供的结构能⼒完成通信 分层…

QT 使用QPdfWriter和QPainter绘制PDF文件

QT如何生产pdf文件&#xff0c;网上有许多文章介绍&#xff0c;我也是看了网上的文章&#xff0c;看他们的代码&#xff0c;自己琢磨琢磨&#xff0c;才有了本编博客&#xff1b; 其他什么就不详细说了&#xff0c;本篇博客介绍的QPdfWriter和QPainter绘制PDF文件&#xff1b;…

企业标准信息公共服务平台已开放标准通编辑器访问入口

标准通 数字化标准编辑器 专业、高效、便捷 企业标准信息公共服务平台 近日&#xff0c;企业标准信息公共服务平台已开放标准通编辑器访问入口&#xff0c;可进入官网指定版块使用&#xff01; 核心功能亮点 解决企业痛点 传统标准编制&#xff0c;需反复核对格式、逐条…

【Hadoop】--HA高可用搭建--3.2.2

修改环境配置文件 hadoop-env.sh # 在文件末尾添加以下内容&#xff1a; # java_home记得修改 export JAVA_HOME/usr/java/jdk1.8.0xxxx export HDFS_NAMENODE_USERroot export HDFS_DATANODE_USERroot export HDFS_ZKFC_USERroot export HDFS_JOURNALNODE_USERroot export YA…

【skywalking】index“:“skywalking_metrics-all“},“status“:404}

skywalking 启动报错 java.lang.RuntimeException: {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [skywalking_metrics-all]","resource.t ype":"inde…

【Android】从垂直同步到屏幕刷新机制(一)

【Android】从垂直同步到屏幕刷新机制 本文参考以及部分图片来源&#xff1a; 垂直同步_小科普&#xff1a;“垂直同步”究竟是什么&#xff1f;-CSDN博客 “终于懂了” 系列&#xff1a;Android屏幕刷新机制—VSync、Choreographer 全面理解&#xff01;-腾讯云开发者社区-腾讯…

ACL完全解析:从权限管理到网络安全的核心防线

访问控制列表&#xff08;ACL&#xff09;是一种用于管理资源访问权限的核心安全机制&#xff0c;广泛应用于操作系统和网络设备中。以下是对ACL的详细解析&#xff1a; 1. 基本概念 定义&#xff1a;ACL是由多个访问控制条目&#xff08;ACE&#xff09;组成的列表&#xff0…