深入理解mysql(六):undo log

一.概论

通过前面的文章,我们已经知道mysql在修改数据的时候,会把数据从磁盘加载到buffer pool中,修改里面的free/flush/lru链表,IO线程会后台刷新数据到磁盘中,同时会把数据记录到redolog中,防止mysql宕机时候数据的丢失,如果一个事物包含多个sql,比如三个增删改sql,前两个sql执行好了,这个时候需要回滚事物,但是缓存中的前两个sql的数据都已经改了,怎么才能进行回滚呢? 这就需要undo log

二.undo log

2.1 undo log简介

undolog回滚日志,记录的东西不是很复杂,其实就是记录你sql执行的逆过程,比如你执行一个insert插入一条新数据,那么undolog日志中就必须记录这个主键和对应的一个delete语句,能把你的insert语句进行回滚;

如你你执行是一个delete语句,那么起码要把你删除的数据记录要下,这样事物回滚的时候,就能把之前删除的数据再次添加进来

如果你执行是update语句,就要把修改之前的旧值记录下来,方便回滚的时候回复原来的数据

如果你执行是select语句,那最好,因为select语句根本不需要记录undolog中,😄😄😄😄

2.2 undolog 的格式

回滚日志包含下面五部分,下图所示

1.日志开始位置

一条日志必须要知道从那里开始,到那里结束

2.主键的各列长度和值

插入一条数据,必然有一个主键,哪怕自己没有设置主见id,mysql也会默认生成一个隐藏的row_id作为主键;这个主键还可以是自己设置的联合主键,比如 "id+name+city",这个时候就需要记录这个主键的各列的长度和值

3.表id

每次对数据库进行操作,肯定要记录是对哪个表进行操作,所以要记录下来

4.日志编号

一个事物有多个sql,就会有多个undolog日志

5.日志类型

常用的有下面几种

  1. TRX_UNDO_INSERT_REC:表示在事务中插入记录时生成的undo日志。
  2. TRX_UNDO_UPDATE_REC:表示在事务中更新记录时生成的undo日志。
  3. TRX_UNDO_DELETE_REC:表示在事务中删除记录时生成的undo日志。

6.结束标志

和开始标志一样,不做赘述

三.总结

undolog还是比较容易理解的,就是把事物中的sql记录下来,后面回滚的时候能进行逆向操作即可

相关推荐
架构师老Y10 小时前
007、微服务架构设计与服务拆分策略
python·微服务·架构
Meme Buoy10 小时前
13.6其他架构评估方法-中间件
中间件·架构
skilllite作者10 小时前
SkillLite 多入口架构实战:CLI / Python SDK / MCP / Desktop / Swarm 一页理清
开发语言·人工智能·python·安全·架构·rust·agentskills
2501_9333295510 小时前
技术深度剖析:Infoseek 字节探索舆情处置系统的全链路架构与核心实现
大数据·数据仓库·人工智能·自然语言处理·架构
何陋轩11 小时前
AI时代,程序员何去何从?别慌,看完这篇你就明白了
后端·面试
weixin_4080996711 小时前
OCR 识别率提升实战:模糊 / 倾斜 / 反光图片全套优化方案(附 Python / Java / PHP 代码)
图像处理·人工智能·后端·python·ocr·api·抠图
weixin_4080996711 小时前
【实战教程】懒人精灵如何实现 OCR 文字识别?接口调用完整指南(附可运行示例)
java·前端·人工智能·后端·ocr·api·懒人精灵
珍朱(珠)奶茶11 小时前
Spring Boot3整合Jxls工具包实现模版excel导出文件
spring boot·后端·excel
正在走向自律11 小时前
企业级数据库存储运维实战:表空间自动创建与存储架构深度优化
运维·数据库·架构·表空间
Daemon11 小时前
AI Agent系列记录(第二篇)
前端·人工智能·后端