上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.1.8 内部XA二阶段提交
MySQL有两种XA,即外部XA和内部XA。外部XA一般指分布式一致性事务,这里暂不讨论;内部XA就是指将事务分为两个阶段来实现引擎层和服务层的一致性。我们可以设想一下,假如没有XA,redo日志提交失败,而binlog提交成功,这样binlog和redo日志就不一致了,当备库回放同步过来的binlog后,最终会导致主备数据不一致,所以保证redo日志和binlog的一致性至关重要。让我们先来看看二阶段提交的阶段过程。
二阶段提交分为两个阶段。
Prepare阶段:包括InnoDB Prepare(记录redo日志)和binlog Prepare(此阶段什么都不做)。
Commit阶段:包括Flush(记录binlog)、Sync(由binlog缓存同步至磁盘)和Commit(InnoDB Commit)。
如果事务在这两个阶段期间数据库意外宕机,那么redo日志和binlog之间应该如何保证一致呢?数据库重启后,MySQL会对比binlog和redo日志中XID一致的事务,最终以binlog中提交的事务为准进行重做和回滚。我们来看如下几种情况。
在Prepare阶段数据库宕机,这时binlog还没有被写入,数据库重启后回滚事务。
在Flush阶段数据库宕机,这时binlog还没有被刷新至磁盘,数据库重启后回滚事务
在Sync阶段数据库宕机,这时binlog已被刷新至磁盘,数据库重启后会对比binlog和redo日志中XID一致的事务,如果双方都存在该事务,则会进行InnoDB Commit。