MySQL优化班13期课后作业,20180830

T6.2,为什么需要2阶段提交机制
已邀请:

aaron8219 - Oracle DBA

赞同来自:

首先,2阶段提交是指在开启binlog以后,redo log和binlog的2阶段提交,而非XA事务的的二阶段提交
2阶段提交主要经历以下两个阶段:
1)prepare阶段:将redo log刷到磁盘,将回滚段设置为prepare状态,binlog不做操作
2)commit阶段:innodb释放mutext锁,释放回滚段,设置提交状态,binlog刷到磁盘
当实例异常宕机需要进行recover操作时,如果binlog存在(已同步到磁盘),则提交事务,反之则回滚事务,可以保证redo log和binlog的一致性
因为MySQL的redo log并不是完全的物理日志,在进行恢复重放时,需要依赖于binlog来保证事务的一致性,而2阶段提交机制则很好地做到了这一点

nineuping

赞同来自:

2阶段提交机制可以保证主从环境数据的一致性。如果没有2阶段提交机制,可能会发生crash recovery后数据存在,但是Binlog不存在,数据相应更改就没办法传到从库上。如果crash recovery后数据不存在,但是Binlog存在,那么不存在的数据就会被复制到从库上,从而导致主从环境数据的不一致。
 
 

liyh

赞同来自:

根据图,我的理解是,client端事务提交给server端,server端prepare 预提交给engine引擎层,写redo buffer,redo log 写完返回给server端ok,server端开始写binlog,binlog写完,返回给server层,server端开始向磁盘刷binlog,binlog写磁盘后,返回给server 端ok。server端向引擎端提交事务。引擎端提交事务完成后,返回ok给server端,server段返回给client端。
两段提交是哪两段呢?一段是redo log 提交,一段是bin log 提交吗?节点是buffer提交还是刷到磁盘上才算?
 
 

要回复问题请先登录注册