MySQL两阶段提交

MySQL两阶段提交

redo log与binlog的区别

  • redo log是innoDb引擎独有的,大小固定,也是磁盘上的一块存储,但是顺序读写I/O性能高。写完之后会重新从头写,会覆盖之前的记录。用于预存储修改,记录的事那个表上的哪个值被修改。
  • binlog是mysql server所有,所有引擎都有,用于追加记录会发生写操作(statement或者row模式)。一般用户主从复制,server崩溃回复数据。

两阶段提交

第一阶段:一个update操作,先将更新写入redo log,将redo log状态改为prepare。
然后将更新记录到binlog(落到磁盘),
第二阶段:等binlog成功落盘后,将redo log状态改为commit

两阶段提交的原因

1.先写redo log(没有prepare和commit阶段)在写binlog:如果系统在redo log之后崩溃,此时binlog中没有没有数据,当crash recovery从binlog中恢复数据,就会少一条数据。
2.先写binlog在写redo log(没有prepare和commit阶段):如果在binlog之后崩溃,redo log中就会少一条数据,当crash recovery从binlog中恢复数据,就会多一条数据。

恢复原理

扫描最后一个Binlog文件,提取其中的Xid_log_event重做检查点以后的redo日志,读取事务的undo段信息,搜集处于prepare阶段的事务链表,将事务的xid与binlog中的xid对比,若存在,则提交,否则就回滚。

恢复过程

  1. binlog有记录,redo log状态为commit,正常完成的事务,不需要恢复;
  2. binlog有记录,redo log状态为prepare,在binlog写完提交事务之前的crash,恢复操作:提交事务。(因为之前没有提交)
  3. binlog无记录,redolog状态prepare:在binlog写完之前的crash,恢复操作:回滚事务(因为crash时并没有成功写入数据库)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值