jta mysql_JTA 使用 MySQL 分布式事务

假定在MySQL实例1上有表

create table person(

id int,

name varchar(32)

)

MySQL实例2上也有一张同样的表,现在从实例1中的 person 表中删除一条数据,并把这条数据插入到实例2的表中,这两个操作在同一个事务中,因为跨越了数据库实例,涉及到了分布式事务。

MySQL实现了分布式事务,查看数据库是否启用了 XA 事务:

show variables like 'innodb_support_xa';

MySQL 关于xa的命令:

xa start 'a';

sql 语句;

xa end 'a';

xa prepare 'a';

xa commit 'a';

与正常事务相比,XA 命令多了 prepare,询问是否准备好,事务管理器根据 prepare 返回的结果进行操作。

以上命令是分布式事务的操作方法,在一个命令行中输入上述命令,并不是真实的分布式事务。可以使用 JTA 来控制MySQL的 XA:

public class JTA_MySQL {

public static void main(String[] args) {

XADataSource xaDs1 = JTA_MySQL.getDataSource(

"jdbc:mysql://172.30.60.126:3306/db_zhang", "root",

"root");

XAConnection xaCon1 = null;

XAResource xaRes1 = null;

Connection conn1 = null;

Statement stmt1 = null;

XADataSource xaDs2 = JTA_MySQL.getDataSource(

"jdbc:mysql://172.30.60.124:3306/db_zhang", "root",

"root");

XAConnection xaCon2 = null;

XAResource xaRes2 = null;

Connection conn2 = null;

Statement stmt2 = null;

int ret1 = 0;

int ret2 = 0;

Xid xid1 = new MyXid(100, new byte[] { 0x01 }, new byte[] { 0x02 });

Xid xid2 = new MyXid(100, new byte[] { 0x01 }, new byte[] { 0x03 });

try {

xaCon1 = getXAConnetion(xaDs1);

conn1 = getConnection(xaCon1);

stmt1 = conn1.createStatement();

xaRes1 = xaCon1.getXAResource();

xaCon2 = getXAConnetion(xaDs2);

conn2 = getConnection(xaCon2);

stmt2 = conn2.createStatement();

xaRes2 = xaCon2.getXAResource();

xaRes1.start(xid1, XAResource.TMNOFLAGS);

stmt1.execute("delete from person where id=1");

xaRes1.end(xid1, XAResource.TMSUCCESS);

xaRes2.start(xid2, XAResource.TMNOFLAGS);

stmt2.execute("insert into person select 1, 'zhang'");

xaRes2.end(xid2, XAResource.TMSUCCESS);

ret1 = xaRes1.prepare(xid1);

ret2 = xaRes2.prepare(xid2);

if (XAResource.XA_OK == ret1 && XAResource.XA_OK == ret2) {

xaRes1.commit(xid1, false);

xaRes2.commit(xid2, false);

System.out.println("提交分布式事务");

} else {

xaRes1.rollback(xid1);

xaRes2.rollback(xid2);

System.out.println("回退分布式事务");

}

} catch (SQLException e) {

e.printStackTrace();

} catch (XAException e) {

e.printStackTrace();

}

}

private static XADataSource getDataSource(String url, String user,

String password) {

MysqlXADataSource dataSource = new MysqlXADataSource();

dataSource.setUrl(url);

dataSource.setUser(user);

dataSource.setPassword(password);

return dataSource;

}

public static XAConnection getXAConnetion(XADataSource dataSource) {

XAConnection XAConn = null;

try {

XAConn = dataSource.getXAConnection();

} catch (SQLException e) {

e.printStackTrace();

}

return XAConn;

}

public static Connection getConnection(XAConnection XAConn) {

Connection conn = null;

try {

conn = XAConn.getConnection();

} catch (SQLException e) {

e.printStackTrace();

}

return conn;

}

public static void closeConnection(Connection conn) {

try {

conn.close();

} catch (SQLException e) {

System.out.println("连接关闭失败");

}

}

}

MyXid 类:

public class MyXid implements Xid {

private int formatId;

private byte[] globalTid;

private byte[] branchQ;

public MyXid(int formatId, byte[] globalTid, byte[] branchQ) {

this.formatId = formatId;

this.globalTid = globalTid;

this.branchQ = branchQ;

}

public byte[] getBranchQualifier() {

return this.branchQ;

}

public int getFormatId() {

return formatId;

}

public byte[] getGlobalTransactionId() {

return this.globalTid;

}

}

Mysql分布式事务

关于Mysql分布式事务介绍,可参考:http://blog.csdn.net/luckyjiuyi/article/details/46955337 分为两个阶段:准备和执行阶段.有两个角色:事务的 ...

mysql 分布式事务

php + mysql 分布式事务 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicit ...

详解Mysql分布式事务XA(跨数据库事务)

详解Mysql分布式事务XA(跨数据库事务) 学习了:http://blog.csdn.net/soonfly/article/details/70677138 mysql执行XA事物的时候,mysq ...

Spring+JTA+Atomikos+mybatis分布式事务管理

我们平时的工作中用到的Spring事务管理是管理一个数据源的.但是如果对多个数据源进行事务管理该怎么办呢?我们可以用JTA和Atomikos结合Spring来实现一个分布式事务管理的功能.了解JTA可 ...

php + mysql 分布式事务(转)

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicity).一个事务是一个不可分割的工作单 ...

php + mysql 分布式事务

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicity).一个事务是一个不可分割的工作单 ...

了解一下Mysql分布式事务及优缺点、使用案例(php+mysql)

在开发中,为了降低单点压力,通常会根据业务情况进行分表分库,将表分布在不同的库中(库可能分布在不同的机器上),但是一个业务场景可能会同时处理两个表的操作.在这种场景下,事务的提交会变得相对复杂,因为多 ...

分布式事务(三)mysql对XA协议的支持

系列目录 分布式事务(一)原理概览 分布式事务(二)JTA规范 分布式事务(三)mysql对XA协议的支持 分布式事务(四)简单样例 分布式事务(五)源码详解 分布式事务(六)总结提高 引子 从Mys ...

【分布式事务】使用atomikos+jta解决分布式事务问题

一.前言 分布式事务,这个问题困惑了小编很久,在3个月之前,就间断性的研究分布式事务.从MQ方面,数据库事务方面,jta方面.近期终于成功了,使用JTA解决了分布式事务问题.先写一下心得,后面的二级提 ...

随机推荐

Javascript的自执行函数

自执行函数其实也就是"立即执行的函数",它有四个特点:提高性能.利于压缩.避免冲突.依赖加载: 1.减少作用域查找 JS代码: // Anonymous function that ...

转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

RPM 包下载 GCC 4.8安装

http://ftp.scientificlinux.org/linux/scientific/ http://www.rpmfind.net/linux/rpm2html/search.php?qu ...

【MVC】ASP.NET MVC中实现多个按钮提交的几种方法

有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...

S3C2440 TFTLCD驱动详解

S3C2440自带有LCD控制器,该控制器主要有以下接口 仅仅说TFT显示器,TFT显示器的时序如下 TFT显示器的驱动是以行列的形式逐点扫描过来的,驱动时钟有三种,一种是行时钟,一种是列时钟,还有一 ...

C# IE浏览器

引用Microsoft HTML Object Library 引用 -> com -> Microsoft HTML Object Library 引用后,显示如图 1.判断ie浏览器是 ...

win8.1 AMD 屏幕亮度无法调整

lenovo z465  AMD处理器. win8.1 pro系统   屏幕亮度无法调整解决办法:   1:当然是先去本地服务里禁用"Sensor Monitoring Service&qu ...

Java笔记(三)异常

异常 一.概念 一)为什么会有Java异常机制 在没有Java异常机制的情况下,唯一的退出机制就是返回值,判断是否异常的方法就是 返回值.方法根据是否异常返回不同的返回值,调用者根据不同的返回值进行判 ...

SQLite在Android程序中的使用方法,SQLite的增删查改方法

Sqlite: 1.一款用来实现本地数据存储的轻量级数据管理工具,是众多用来实现数据库管理的工具之一. 2.Android已经将SQLite的代码功能吸收在它的系统中,我们可以直接在Android程序 ...

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

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

相关文章

mysql load average_紧急求助:load average太高了!!

站点同时在线人数300人左右,top出来的load average超过4,有时达到了8点多!sleeping进程达到了三百多!大部分是来自apache,导致房问速度很慢!!不知问题出在哪里,请高手赐教,谢谢&…

a jni error has occurred_A-08 幂函数、有理函数、代数函数

欢迎光临我的专栏《微积分学习之旅》,一起学习,共同提高。函数是微积分的基础,我们已经学习了直线函数和多项式函数,本篇中我们继续学习幂函数、有理函数和代数函数。幂函数(Power Functions)如果一个函数形…

mysql 求两列数据组合_mysql – 将两个具有不同列数的查询组合在一起

我有两个查询要组合成单个输出,我不能使用UNIOn,因为它们具有不同的列数.该表是ref,字段id为refid cellid cat,其中包含整数查询1:查找每个唯一cellid的总行数SELECT cellid,COUNT(*) totalcount,cat FROM rel GROUP BY cellid查询2:为每个唯一的cellid查…

echarts 浏览器兼容性_谷歌浏览器不再使用quot;黑名单quot; / iPhone可能放弃lightning充电口//微软中国被列为被执行人/QQ 音乐上线...

# 避免种族歧视 ,谷歌浏览器将不再使用"黑名单"6月9日报道,由于全球各地反对种族歧视的呼声高涨,谷歌决定修改Chrome浏览器中可能引发种族歧视联想的表述,包括“黑名单”、“白名单”等词。报道称,谷歌将通过…

python输出结果每5个换行_python for循环 - python基础入门(11)

文章首发微信公众号,微信搜索:猿说python在python开发中,除了前篇文章介绍的while循环还有一个for循环也经常使用,两者使用都是大同小异,for循环的使用相对于while循环更加灵活,下面我们一起来了解下具体区…

cad钣金展开插件_钣金折弯展开的计算方法汇总

提醒:点上方↑↑↑“钣金学习网”免费关注90度折弯折弯系数最简单的计算方法就属90度折弯系数经验公式:1.7倍料厚计算方法了。这个公式是怎么使用的?用在90钣金折弯加工中,一个直角弯减去1.7倍的料厚。比如:材料是1mm铁…

pcb设计实战与应用智能手机_一种针对毫米波雷达天线应用而优化设计的PCB层压板...

常见的复合材料印制电路板(PCB)其介质层大多采用玻璃纤维作为填充料,但是由于玻璃纤维特殊的编织结构,导致PCB板局部的介电常数(Dk)会发生变化。尤其是在毫米波(mmWave)频率下,较薄层压板的玻璃编织效应会更加明显,Dk的局部不均匀…

mysql 5.5 替换字符_MySQL replace函数替换字符串语句的用法

MySQL replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法,希望对您学习MySQL replace函数方面能有所启迪。最近在研究CMS,在数据转换的时候需要用到mysql的MySQL replace函数,这里简单介绍一下。比如你要将表 t…

GPS 校验和 代码_Linux recovery 移除签名校验

原创作者:王锐,多年 Linux 系统、龙芯平台移植与优化研发经验,Linux Contributor、Mozillian。背景某个设备配套的刷机程序是个 Linux recovery kernel,刷机过程会先从U盘加载刷机脚本,仅在签名校验通过后才执行脚本。…

mysql xp系统时间_mysql时间类型year

date:年月日datetime:年月日时分秒,保存确定的时间点的时候,存储形式yyyy-mm-dd hh:MM-dd,暂用8个字节timestamp:时间从.存储时是整形数字,表现形式是yyyy-mm-dd hh:MM-dd,暂用4个字节,取值范围,1970-01-01 00:00:00到2038year:1个字节 1901-2155,可以用0000表示默认值,如果输…

shell su 密码_[SU模型] 59个公共卫生间

介绍 - Introduce名称|59个公共卫生间格式|skp大小|127 MB获取方式|免费获取嗨,大家好~今天给大家分享的是59个公共卫生间模型。文末获取素材- 部分素材内容的预览图如下 -A | ZD有一个计划:前期在公众平台…

mysql 备份成文件的脚本_Mysql自动全量备份脚本

数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果。轻则程序逻辑出现BUG,重则程序崩溃,数据丢失。造成数据丢失的原因,主要有程序错误、人为错误、计算机失败、磁盘失败、灾难(如起火、地震)和偷窃。数据库日常备份工…

python中使用什么导入模块-Python中使用语句导入模块或包的机制研究

这篇文章讨论了Python的from import *和from import *,它们怎么执行以及为什么使用这种语法(也许)是一个坏主意。 从一个模块导入全部 from import * means意味着“我希望能访问中我有权限访问的全部名称”。例如以下代码something.py&#x…

mysql触发器的要素_MySQL触发器

触发器是一类特殊的事务,可以监视某种数据操作(insert,update,delete),并触发相关操作(insert,update,delete)触发器创建之四要素:监视地点(table)监视事件(insert,update&#xff0…

您与此网站建立的连接不安全_dede网站密码忘记找回服务为先

dede网站密码忘记找回服务为先网站安全是现在一个非常重要的课题。基本上,互联网上的所有用户群都对自己的隐私信息和企业相关信息更感兴趣。因此,无论是搭建网站还是做一些平台,用户对网站服务器和网站空间安全都有很高的要求。对于网站服务…

python入门必备知识_python入门基本知识

1. 什么是语言语言是一个事物与另外一个事物沟通的介质。python则是人(程序员)与计算机沟通的介质。2. 什么是编程编程就是程序员将自己想要让计算机做的事情用编程语言翻译出来写到一系列的文件中。这一系列的文件称之为程序/软件。3. 为何要编程编程的目的就是让计算机按照程…

通达信手机版指标源码大全_通达信指标公式源码短炒买卖指标

做价值的传播者,一路同行,一起成长问题:怎样才能每天都收到这类文章!答案:只需点击上方《通达信指标公式软件》VAR1:((CLOSE-MA(CLOSE,6))/MA(CLOSE,6)*100(CLOSE-MA(CLOSE,24))/MA(CLOSE,24)*100(CLOSE-MA(CLOSE,32))…

c++ curl 超时_cc++写网络爬虫,curl+gumbo配合使用

是的,你没有听错。就是用c或者说c语言写爬虫。其实不难,虽然没有Python写起来那么简单。但是也不是那么复杂啦,毕竟好多大佬都写了那么多库,我们只要会用大佬写的库就行。网址:https://acm.sjtu.edu.cn/OnlineJudge/st…

S如何边缘控制_强夯法效果如何?来看看这个检测结果

强夯法指的是为提高软弱地基的承载力,用重锤自一定高度下落夯击土层使地基迅速固结的方法。强夯法适用于处理碎石土、砂土、低饱和度的粉土与黏性土、湿陷性黄土、杂填土和素填土等地基。对高饱和度的粉土与黏性土等地基,当采用在夯坑内回填块石、碎石或…

metinfo mysql_Metinfo 5.3.17 前台SQL注入漏洞

Metinfo 8月1日升级了版本,修复了一个影响小于等于5.3.17版本(几乎可以追溯到所有5.x版本)的SQL注入漏洞。这个SQL注入漏洞不受软WAF影响,可以直接获取数据,影响较广。### 0x01. 漏洞原理分析漏洞出现在 /include/global.func.php 文件的 jum…