Mysql分布式事务
4月28日 罗刹长投稿 Mysql分布式事务
为了规范分布式事务的管理,XOPEN提出了分布式事务处理规范XA协议,XA规范了TM与RM之间的通信接口,在TM与多个RM之间形成一个双向通信桥梁,从而在多个数据库资源下保证ACID四个特性。目前知名的数据库,如Oracle,DB2,mysql等,都是实现了XA接口的,都可以作为RM。
XA是数据库的分布式事务,强一致性,在整个过程中,数据都处于被锁住的状态,即从prepare到commit、rollback的整个过程中,TM一直拥有参与分布式事务RM对应的数据库的锁,如果有其他人要修改数据库的该条数据,就必须等待锁的释放,存在长事务风险。分布式事务模型
XOpen定义了分布式事务处理模型,包括应用程序AP、事务管理器TM、资源管理器RM、通信资源管理器CRM。
在XA规范中分布式事务有AP、RM、TM组成:应用程序(ApplicationProgram):定义事务边界(定义事务开始和结束)并访问事务边界内的资源资源管理器(ResourceManager):RM管理计算机共享的资源,资源包含比如数据库、文件系统等事务管理器(TransactionManager,简称TM):负责管理全局事务,分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚、失败恢复等。分布式事务的基本流程如下:
具体流程如下:配置TM,将RM注册到TMAP从TM获取资源管理器的代理,获取TM所管理的RM的JDBC连接AP向TM发起全局事务TM将XID通知到各RMAP通过Connection连接直接对RM进行操作AP结束全局事务TM会通知RM全局事务结束开始二阶段提交两阶段提交
当每个RM都结束了全局事务的执行后,此时每个RM管理的分布式事务分支还没有提交,只是把该事务管理的业务逻辑执行完了。
进入二阶段提交阶段,在这个阶段,会先进入prepare阶段,然后再是commit或者rollback阶段。
具体流程如图:
第一阶段分为两个步骤:事务管理器通知参与该事务的各个资源管理器,通知他们开启事务、执行SQL(暂不提交),并进入prepare状态(该状态下可执行commitrollback)。资源管理器接收到消息后开始准备阶段,写好事务日志并执行事务,但不提交,然后将是否就绪的消息返回给事务管理器RM根据自己的情况,如果判断自己进行的工作可以被提交,那就就对工作内容进行持久化,并给TM回执OK;否者给TM的回执NORM在发送了否定答复并回滚了已经的工作后,就可以丢弃这个事务分支信息了
第二阶段也分为两个步骤:事务管理器在接受各个消息后,开始分析,如果有任意其一失败,则发送回滚命令,否则发送提交命令。各个资源管理器接收到命令后,执行(耗时很少),并将提交消息返回给事务管理器。
两阶段提交的好处是有了事务管理器进行统一管理,让事务在提交前尽可能的完成所有能完成的工作。同时两阶段提交可以保证事务的一致性,不管是事务管理器还是各个资源管理器,每执行一步操作都会被日志记录,为出现故障后的恢复提供依据。Mysql中的XA语法
Mysql中分布式操作的基本模板如下:开启xa事务,XAstartxidDML语句,即SQL增删改查语句终止XA事务,XAendxid预提交事务,XApreparexid,这一步是有返回值的提交,XAcommitxid,根据prepare操作的返回结果做的处理回滚,XArollbackxid,根据prepare操作的返回结果做的处理XARECOVER:返回当前数据库中处于PREPARE状态的分支事务的详细信息
每个事务必须有一个唯一的xid值,因此当前值不能被其他XA事务使用,xid是一个XA事务标识符,用来唯一标识一个分布式事务。
xid值可以由客户端提供,或者由Mysql服务器生成。
xid基本格式如下:xid:gtrid〔,bqual〕〔,formatID〕gtrid是一个分布式事务标识符,相同的分布式事务使用相同的gtrid,这样可以明确知道XA事务属于哪一个分布式事务bqual是一个分支限定符,默认为空串,对于一个分布式事务中的每个分支事务,bqual必须是唯一的formatID是一个数字,用于标识由gtrid和bqual值使用的格式,默认为1
XA语法中用到的xid值都必须和START操作使用的xid值相同使用演示
上面给出的是命令行方式的演示过程,下面再给出java代码的使用过程:publicMysqlXADataSourcexaDataSource(Stringurl,Stringuname,Stringpwd){MysqlXADataSourcexanewMysqlXADataSource();xa。setUrl(url);xa。setUser(uname);xa。setPassword(pwd);}TestpublicvoidtestXA(){MysqlXADataSourcetestXAxaDataSource(jdbc:mysql:xxx:3306test,root,xxx);MysqlXADataSourcetrainingXAxaDataSource(jdbc:mysql:xxx:3306training,root,xxx);try{获取每个分支事务的连接XAConnectiontesttestXA。getXAConnection();XAResourcetestXAResourcetest。getXAResource();ConnectiontestConntest。getConnection();StatementtestStatementtestConn。createStatement();XAConnectiontraintrainingXA。getXAConnection();XAResourcetrainXAResourcetrain。getXAResource();ConnectiontrainConntrain。getConnection();StatementtrainStatementtrainConn。createStatement();生成每个分支事务对应的XIDMysqlXidtestXidnewMysqlXid(test。getBytes(StandardCharsets。UTF8),testDB。getBytes(StandardCharsets。UTF8),1);MysqlXidtrainXidnewMysqlXid(test。getBytes(StandardCharsets。UTF8),trainDB。getBytes(StandardCharsets。UTF8),1);事务分支1关联分支事务sql语句testXAResource。start(testXid,XAResource。TMNOFLAGS);testStatement。execute(UPDATEstuSETclassId3WHEREid1);testXAResource。end(testXid,XAResource。TMSUCCESS);事务分支2关联分支事务sql语句trainXAResource。start(trainXid,XAResource。TMNOFLAGS);trainStatement。execute(UPDATESalersSETSNO123WHERESNAME123);trainXAResource。end(trainXid,XAResource。TMSUCCESS);两阶段提交协议第一阶段inttestRestestXAResource。prepare(testXid);inttrainRestrainXAResource。prepare(trainXid);两阶段提交协议第二阶段if(XAResource。XAOKtestResXAResource。XAOKtrainRes){存储引擎级别事务提交testXAResource。commit(testXid,false);trainXAResource。commit(trainXid,false);}else{testXAResource。rollback(testXid);trainXAResource。rollback(trainXid);}}catch(SQLExceptionXAExceptione){e。printStackTrace();}}上面代码中出现了一些XAResource标记,这里解释一下:XAResourcestart方法开启一个分支事务
下面提到的名词都是XAResource类中的常量,分别对应一个整数值XAResource:voidstart(Xidxid,intflags)throwsXAE
如果这里标记传入的是TMJOIN,会尝试去加入上一个被RM记录的事务中去。如果TMRESUME被设置了,会尝试去恢复xid与自己相同的并且是被挂起的事务分支。如果没有设置上面两个标记,并且还找到了一个分支事务并且该分支事务xid与自己相同,那么会抛出异常
一般无特殊情况推荐使用TMNOFLAGS,表示不设置任何标志XAResourceend方法结束当前分支事务的执行XAResource:voidend(Xidxid,intflags)throwsXAE
这里标记的设置分为了三种情况:TMSUCCESS:该分支事务已经成功完成了TMFAIL:该分支事务执行失败,RM会标记当前事务为回滚状态TMSUSPEND:会将当前分支事务临时挂起进入未完成状态,当前事务被挂起后需要通过start方法设置TMRESUME来恢复XAResourcecommit方法提交当前分支事务XAResource:voidcommit(Xidxid,booleanonePhase)throwsXAE
onePhase标志是否为一阶段提交,两阶段提交协议中,如果只有一个RM参与,那么可以优化为一阶段提交。相当于跳过了prepare一阶段提交,变成了局部事务的处理方式XA状态转换图
XA的BUG
在Mysql5。5之前的版本中,如果分支事务到达prepare状态,此时数据库异常重启后,可以选择对分支事务进行提交或者回滚,但是即使选择提交事务,该事务也不会被写入BINLOG日志,这会导致在使用BINLOG恢复数据时,丢失部分数据,并在如果存在从库,可能导致主从数据库的数据不一致。
此外,如果是分支事务的客户端连接异常终止的话,例如执行prepare之后退出连接,那么数据库会自动回滚未完成的事务,之所以这样做是因为对于prepare的事务,MySQL是不会记录binlog的(官方说是减少fsync,起到了优化的作用)。只有当分布式事务提交的时候才会把前面的操作写入binlog信息,所以对于binlog来说,分布式事务与普通的事务没有区别,而prepare以
前的操作信息都保存在连接的I0CACHE中,如果这个时候客户端退出了,以前的binlog信息都会被丢失,再次重连后允许提交的话,会造成Binlog丢失,从而造成主从数据的不一致,所以官方在客户端退出的时候直接把已经prepare的事务都回滚了!
但是如果分布式事务情况下,其他分支事务都成功提交,这个分支回滚,会导致分布式事务的不完整,丢失部分分支事务内容。MySql5。7中做了以下优化:在session断开和实例崩溃的情况下,事务都不会自动回滚,同时在XAPREPARE时,之前的事务信息就会被写入到BINLOG并同步到从库,最终再由用户决定事务回滚或者提交。XA的性能问题XA事务和本地事务以及锁表操作是互斥的,因为XA事务会锁住当前表开启了xa事务就无法使用本地事务和锁表操作开启了本地事务就无法使用xa事务
1)在执行分支事务时,会将RM资源锁住,需要等到所有的RM响应,等到第二阶段执行完毕时(提交回滚),RM的锁才会释放,在高并发场所不适用。
2)XA方案依赖于本地数据库对XA协议的支持,如果本地数据库不支持XA协议那么第三方程序(Java)将操作不了。例如许多非关系型数据库并没有支持XA。
3)MySQL对XA方案支持的不太友好,MySQL的XA实现,没有记录prepare阶段日志。
原文链接:blog。csdn。netm053157173articledetails125275556?utmsourcetuicoolutmmediumreferral
投诉 评论
广西到越南国际班车恢复运营图为工作人员正在检票。王伟臣摄中新网南宁1月8日电(王伟臣)新冠病毒感染乙类乙管措施8日起正式实施,当天,广西南宁埌东汽车站内,几名旅客正在重点旅客候车区候车,他们将搭乘……
格鲁吉亚披萨,99的国人没吃过,自己做真的简单,太香了关注大胖友图图,每天都能看到新奇,简单,美味又实用的食谱哦你都吃过多少种披萨呢?今天我要做一个可能大家没怎么听说过的披萨,格鲁吉亚披萨。格鲁吉亚披萨也可以叫哈洽普里,是格……
鸭瘾犯了!鹅鸭杀遭黑客攻击,预计周四早上6点恢复最近,狼人杀小游戏《鹅鸭杀》风靡出圈,连续三天Steam在线人数超过60万,受到玩家们的一致好评。然而从昨晚开始,《鹅鸭杀》便已经无法正常登录,并且这种情况持续了一整夜都……
全球变暖加剧,我们该怎么办?全球变暖是一个热门话题,它涉及到地球上的每一个人。全球变暖是指地球的气温在逐年升高,导致许多严重的后果。最近每年,全球气候都有极端化的趋势,今天一起来聊聊全球变暖。关注小……
塞舌尔5万晚,我住进了威廉王子凯特王妃度蜜月的私密岛酒店!塞舌尔的独立小岛Northlsland,极其出名。这个只有11栋别墅、每晚最低要5万人民币的度假酒店,把世界上众多知名酒店品牌,包括迪拜卓美亚帆船酒店和马尔代夫的岛王路易……
6个实用养生小妙招,果断收藏!养生对于中国人来说是一个具有特殊含义的词,每个人都知道它重要性,并且每个人都自有一套属于自己的养生准则。今天小编就来聊聊让自己受益的养生小妙招吧!泡脚泡脚不仅可以治失眠、……
超级战队十七五星战队大连者《五星战队大连者》1993年2月19日至1994年2月11日于朝日电视台播映,当时是逢星期五17:3017:55播映全50集超级战队系列的第17部作品。播出的时候,被视为……
放下一切,让自己快乐唉,最近真的是心不在焉,无精打采,多愁善感。为什么我的心好累?不能无情,不懂得拒绝,容易满足,容易感动,待人真诚,是被伤害最深的人。知道结局是一样的,我会真心待你。当我问……
月饼消失术中秋节之后的月饼去哪了?解密月饼背后的商业秘密中秋节过后,你是否还在为家中没有吃完的月饼发愁呢?那你有没有想过前几天还在超市货架上的月饼哪去了呢?中秋团圆夜,月饼销售季。中秋佳节是我国的传统节日,同样中秋之前也是月饼……
未成年人及男士勿进女性如何爱护自己的胸部胸部是女人最引以为傲的身体部位,也是彰显女性魅力的最重要的身体器官。完美的胸部能够体现女性的成熟美和完美的曲线,在现代审美观中胸部往往成为衡量一个女人魅力和身材好坏的重要参考,……
坏消息!于根伟在津门虎的左膀右臂突然离开球队,曾是国足主力日前,根据国内媒体报道津门虎足球俱乐部技术总监郑斌已经被带走。前几天,郑斌就传出要被带走,津门足球媒体纷纷辟谣,并且拿出了他现身训练场的照片。很多津门虎球迷都觉得郑斌被带走纯属……
封面有数2022年前三季度全球电视销量三星LGTCL排名前三封面新闻记者孟梅易弋力近日,全球权威数据机构Omdia发布的数据显示,2022年前三季度全球电视销量销售额排名如下:从销售量维度看,三星电子以20。2位居榜首,之后依次是……