MySQL(下)
1. undo日志
- 日志整体图片解读
- 简介:
- 事务id
事务id分配
事务id维护
- undo日志的格式
存放位置
insert类型对应undo日志
undo no
日志信息
roll_pointer指针
delete操作对应的undo日志
阶段一
阶段二(也叫purge操作)
后续插入数据到该页
delete undo日志格式
delete undo日志文件参数
记录该条记录的trx_id和roll_pointer
记录索引列的信息
同一条记录的undo版本链
update undo日志文件
就地更新(不更新主键)
先删除再插入(不更新主键)
更新主键
将旧记录进行delete mark操作(MVCC)
新创建值,插入聚簇索引
增删改对二级索引的影响
insert和delete操作在二级索引与聚簇索引类似
update操作不影响二级索引,则不进行任何操作
update影响二级索引就要对二级索引执行delete mark操作
- undo日志类型
insert undo日志,一般由insert语句和修改主键的update
update日志,删除操作和不修改主键的update类型操作
- 日志链表(一个事物最多4个undo页面链表)
insert链表
update链表
临时表的insert和update也要有两个链表
- undo日志写入过程
- 重用undo页面
该链表只包含一个undo页面
该undo页面已经使用的空间小于3/4
- 回滚段:存放所有undo页面链表的头节点
新的undo页面链表需要从回滚段中申请
一个回滚段有1024个undo slot,也就支持·1204个undo页面链表
mysql有128个回滚段,支持128*1024个回滚链表
- undo日志的使用
2. undo日志面试
- undo日志很紧凑,也是16kb的页,当然类型不是index而是FIL_PAGE_UNDO_LOG
- undo日志没有缓存、直接写磁盘,并且由于是page页,所以没有其他环形队列或者是缓冲区。只是一个事物分配最多四个undo日志链表
- undo日志最关键的两个属性就是事务id以及roll_pointer
- 日志主要分为两类
Insert类型Undo日志:包括insert语句以及更新主键的update
因为都会生成新的数据,update是删除再插入
update类型日志:不更新主键update和delete操作
不会生成新的数据,在元数据上修改,或者新开辟空间
- 主要手段是delete_mark标记原数据和roll_pointer指向undo日志,形成版本链
- insert类型就是通过事务id保证可见性
- 对于未提交事务恢复就是回滚;提交事务(但没持久化)就是重放保证原子性
3. 事务隔离界别和MVCC
- 事务隔离级别
read uncommited
read commited
repeatable read(默认)
- MVCC
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
涵盖各大厂考官最爱问知识点,22年最新整理!