Mysql事务—内部XA的两阶段提交(2pc)

Posted 翔之天空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql事务—内部XA的两阶段提交(2pc)相关的知识,希望对你有一定的参考价值。

 

 

参考:mysql · 引擎特性 · InnoDB 事务子系统介绍 :http://mysql.taobao.org/monthly/2015/12/01/

          主从32讲的15章节:15、MySQL层事务提交流程简析

          45讲的15章节:15  答疑文章(一):日志和索引相关问题

 

 

版本:mysql5.7.24

 

    --二阶段整体流程 |-binlog准备:将上一次commit队列中最大的 seq number 写入到本次事务的last_commit 中 |-prepare阶段: innodb准备,  写redo 到os cache中(redo prepare)。写xid到undo 防止回滚用。 |-xid写入到binlog cache中 |-A时刻 |-提交阶段:   |- flushing阶段: innodb_flush_log_at_trx_commit=1 的情况会  sync 刷redo 从os cache刷到redo log磁盘中(很快)。   循环每个事务的binlog cache到 os cache中。 sync_binlog != 1会触发 dump线程发送event给从库,崩溃恢复会导致从库比主库数据多的情况 |-B时刻   |- Syncing 阶段:刷盘binlog 从os cache 到binlog 磁盘中。           |- sync_binlog=1会触发 dump线程发送event给从库 |-B时刻   |- Commit 阶段:做innodb层的提交(redo commit)。   性能影响:sync到磁盘影响IOPS, 组提交的越多 越对IO好。 redo和binlog都是顺序写 比随即写速度要快   崩溃恢复: A时刻 崩溃,redo没有提交、 binlog 没有写入到磁盘中, 所以事务会回滚。                   在B时刻 崩溃,redo已写入到磁盘 但没有commit提交、binlog 可能写入到binlog磁盘中 可能也会传送到备库执行event,这时会判断binlog中此事务是否完整,如果binlog对应的事务完整则commit提交事务 否则回滚事务  (通过redo和binlog 共有的xid数据字段 到binlog中找对应的事务, 查看此事务  最后有xid event则完整(row格式), 最后有commit则完整(statement格式) )     二阶段设计理念:redo和binlog的 group 组提交  能对IO性能提升,先redo准备 在binlog提交 最后在redo 提交  是因为 redo提交后不可回滚,所以为了保持redo和binlog的数据一致性 ,先让binlog做提交,redo 根据binlog的情况做提交还是回滚。           

 

以上是关于Mysql事务—内部XA的两阶段提交(2pc)的主要内容,如果未能解决你的问题,请参考以下文章

分布式事务业界主流方案

MySQL binlog 组提交与 XA(分布式事务两阶段提交)

[转帖]分布式事务之解决方案(XA和2PC)

浅谈mysql的两阶段提交协议

浅谈mysql的两阶段提交协议

知识贴:分布式事务的两阶段提交协议(2PC)