mysql的两阶段提交理解

一个事务的执行方式(一般存在显式开启和隐式开启,在未申明的情况下一般是隐式事务):redo log存在两阶段提交,prepare和commit.当写完redo log 时,开始写 bin log ,当bin log写完,会在这次事务的最后加上commit(xid),标志这次事务是完整的,此时再在redo log的最后加上commit 标志此次事务完整,再将内存中的数据刷到磁盘。
在这里插入图片描述

基于上面的逻辑,判断事务回滚。
当mysql异常重启,判断顺序,首先是判断redo log是否commit,再去判断bin log。redo log已经有commit标记,那么事务一定提交。
(1) A时刻,当redo log处于prepare阶段,如果此时bin log未写完整,也就是还未进行commit,此时事务会进行回退,不会存储到数据库。
(2) A时刻,当redo log处于prepare阶段,如果此时bin log已经commit,则会提及事务,将数据存储到数据库
(3) B时刻,基于上面的理论,当处于B时刻,事务一定会被提交。

为什么mysql要设计成redo log 处于parper阶段时,bin log commit 就需要提交事务。
因为当数据库重启时,从库会基于bin log进行数据同步和恢复,如果主库binlog已经commit标记,而事务未提交,而从库根据Binlog同步后提交了,那么数据就存在不一致,说到底也就是保证数据的一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值