全球旧事资料 分类
MySQL数据库分布式事务XA实现原理分析
【IT168技术】MySQLXA原理MySQLMySQLXA分为两类,内部XA与外部XA内部XA用于同一实例下跨多个引擎的事务,由大家熟悉的Bi
log作为协调者外部XA用于跨多MySQL实例的分布式事务,需要应用层介入作为协调者崩溃时的悬挂事务,全局提交还是回滚,需要由应用层决定,对应用层的实现要求较高本文,假设读者已经知道MySQL数据库外部分布式事务XA的使用,而将重点放在MySQL数据库,如何处理外部分布式事务XA的crashrecover,以及面对不同的crashrecover的情形,应用程序如何处理,才能够保证分布式事务的一致性。最后,本文简单分析一下目前MySQL数据库外部XA支持存在的问题,以及可选的解决方案。源代码分析基于MySQL5149,MySQL5516。MySQL处理流程1MySQL外部XA正常处理流程MySQL数据库外部XA的正常处理流程,这里不准备介绍,可以参考123。接下来我重点描述一下MySQL数据库外部分布式事务XA的崩溃恢复流程,毕竟此流程跟应用程序如何正确使用外部XA息息相关。2MySQL外部XA崩溃恢复流程若一个运行外部XA分布式事务的MySQL数据库节点发生崩溃,那么其重启之后的崩溃恢复,涉及到外部XA处理的流程如下:Crashrecover:1读取bi
log文件,将文件中的xid存入commit_listhash表顾名思义,所谓的commit_list,就是说此list中对应prepare状态的xid在崩溃恢复过程中均可以被提交,而不在commit_list中的xid,均须回滚bi
log中的xid,都是属于内部xid,由MySQL产生,用于内部XALogccTC_LOG_BINLOGrecover2遍历底层所有的事务引擎,收集处于XA_PREPARED状态的所有xid
f这些xid列表,既包括内部xid,也包括外部xid,存储引擎内部不做区分Ha
dlerccha_recovercommit_list执行各引擎层面提供的recover方法,收集所有的处于prepared状态的xid根据xid分类:3若xid属于内部xid,那么在commit_list中查找此xid,若存在,则提交此xid对应的事务否则,回滚此事务4若xid属于外部xid,那么则将xid插入xid_cachehash表xid_cache中的所有xid,将会通过xarecover命令返回,等待外部程序决策Ha
dlerccxarecover_ha
dlerto
5收集I
oDB存储引擎中,处于prepare状态的所有xid,并返回gothto
recoveri
obase_xa_recovermy_xidxi
folistiget_my_xidifx若当前为外部xid,那么将xid插入xid_cachehash表xid_cache_i
sertxid_cachexelseifxi
commit_list若当前为内部xid,同时此xid在bi
log中存在,则提交hto
commit_by_xidelse若当前为内部xid,r
好听全球资料 返回顶部