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)的主要内容,如果未能解决你的问题,请参考以下文章