同时此xid在bi
log中不存在,则回滚
fhto
rollback_by_xid通过以上的分析,可以总结出:通过以上的分析,可以总结出:MySQL数据库内部,会对xid做区分。内部xid有MySQL数据库自己产生MySQL内部xid格式,将在本文下面给出,用于多引擎间事务的一致性外部xid由应用程序给出,用于跨多MySQL实例的分布式事务。但是存储引擎层不做区分区分在MySQL上层。crashrecover时,存储引擎负责将引擎内部,处于prepare状态的事务收集,并返回MySQL上层。Bi
log作为内部XA的协调者5,在bi
log中出现的内部xid,在crashrecover时,由bi
log负责提交在bi
log中未出现的xid,由bi
log负责回滚。这是因为,bi
log不进行prepare,只进行commit,因此在bi
log中出现的内部xid,一定能够保证其在底层各存储引擎中已经完成prepare。外部XA事务的xid,在crashrecover过程中仅仅是插入xid_cache中,而不做其他处理。等到用户发起xarecover命令时,xid_cache中处于prepare将状态的xid返回。xarecover命令的流程处理如下。xarecover命令处理流程:sql_parseccmysql_execute_comma
dcaseSQLCOM_XA_RECOVERmysql_xa_recover遍历xid_cache,找出其中的状态处于XA_PREPARED的事务,发送客户端whilexshash_eleme
txid_cacheifxsxa_stateXA_PREPAREDprotocolwrite根据xarecover命令收集到的各MySQL数据库实例返回的xid列表,然后再对比应用程序端日志,决定这些xid,哪些全局commit,哪些rollback。
f由于测试中只有一个MySQL数据库实例,因此此时可以直接选择commit处于prepare状态的xid。注:MySQL内部xid格式:MYSQL_XID_PREFIXserver_idmy_xidMYSQL_XID_PREFIX:MySQLXid源码写死8bytesserver_id:MySQL实例的id,ulo
g,4bytesmy_xid:内部自增序列,ulo
glo
g,8bytes例如:”MySQLXid0004”server_id‘’my_xid4因此,使用时应该注意,不要在外部构造这种形式的xid,否则MySQL数据库就会将内部xid与外部xid混淆。一般情况下,构造一个内部xid比较困难,由于server_id一般小于4bytes,不足的部分以ASCINIL
ull补齐,而应用程序一般都不会构造此类的外部xid。
fr