MySQL学习之两阶段提交

两阶段提交

在执行一条update语句时候,通过连接器、分析器、优化器之后,调用操作引擎,将新行写入内存,写入redo log,状态为prepare->写binlog->redo log状态修改为commit。写入redo的过程分为了prepare和commit称为二阶段提交
redo和binlog这两种日志有以下三点不同:

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  2. redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
  3. redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

在这里插入图片描述
以 update test set num=num+1 where id=1来描述二阶段提交的过程:

  1. 执行器调用 Innodb的读接口取出id=1这一行的数据,将num改为num+1,然后在调用Innodb的写接口。
  2. Innodb写接口被调用后,先把数据写到内存,然后写redo log日志,写完后,将redo log日志置为prepare状态,告诉执行器,自己随时可以提交;
  3. 执行器写bin log日志,写完后,调用Innodb进行事务提交。
    在这里插入图片描述
  • 可能出现的宕机时机
    binlog有记录,redolog状态commit:正常完成的事务,不需要恢复;
    binlog有记录,redolog状态prepare:在binlog写完提交事务之前的宕机,恢复操作:提交事务。(因为之前没有提交)
    binlog无记录,redolog状态prepare:在binlog写完之前的宕机,恢复操作:回滚事务(因为宕机时并没有成功写入数据库)

学习:
https://blog.csdn.net/m0_73311735/article/details/127935751

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值