undo log mysql_MySQL百问系列:Undo log 作用

MySQL的Undo Log用于记录事务中的增删改操作,以支持回滚和多版本并发控制(MVCC)。每个记录包含事务ID和回滚指针,形成版本链。Undo Log在事务完成后或回滚时被释放,长期未提交的事务可能导致磁盘空间占用过多。Undo Log是实现事务原子性和MVCC的关键组成部分。
摘要由CSDN通过智能技术生成

问题

undo log是干什么用的?

undo log 版本链

undo log 存放在那里,什么时候会被释放?

支持回滚和MVCC

我们知道innodb 支撑事务。那么事务其中一个功能是需要支持回滚。

事务中可能设计到增,删,改等操作。那么回滚如和实现呢?

如果事务中新增了一条记录,那么我们记录下这条新增的主键,回滚的时候删除即可。

如果事务中删除了一条记录,那么我们记录下记录的所有信息,回滚的时候原样插入即可。

如果事务中修改了一条记录,那么我们要记录原来的信息,回滚的把原来的信息更新回去就好了。

undo log 就是记录这些用于回滚的信息。

那么MVCC 为什么也是靠undo log来实现的呢?

也许你听说过聚簇索引每条记录有个隐藏字段叫row_id,他的作用是如果不指定主键,它就变成了系统内部的自增主键。同时其实每条记录还有两个字段一个是trx_id,一个是roll_pointer.这个两个字段就是用来实现MVCC功能。

trx_id: 修改当前记录的事务id。

roll_pointer:只向一个undo log。

每一条undo log记录当然也有trx_id, 和roll_pointer字段。

准备工作:

CREATE TABLE `student` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) NOT NULL,

`age` int(11) NOT NULL,

`addresss` varchar(255) NOT NULL DEFAULT '',

PRIMARY KEY (`id`),

KEY `index_age` (`age`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

INSERT student VALUES (1,'张一',1,'ssss'),(2,'张二',2,'ssss');

复制代码

聚簇索引内容类似于一下:

id

name

age

address

trx_id

roll_pointer

1

张一

1

ssss

10

insert_undo_log 地址

2

张二

2

ssss

10

insert_undo_log 地址

undo log类似于一下:

id

name

age

address

trx_id

roll_pointer

undo id

1

张一

1

ssss

10

0

2

张二

2

ssss

10

1

undo id 的在同一个事务中依次递增的。

update set age=10 where id = 1; #更新语句一

update set age=20 where id = 1; #更新语句二

复制代码id

name

age

address

trx_id

roll_pointer

undo id

1

张一

1

ssss

20

指向上一条insert log 地址

0

1

张一

10

ssss

21

上一条undo log 地址

0

几点说明:

insert log 在上一个插入事务结束后,会被回收,释放。

更新语句一 ,roll_pointer 会保存上一条插入的insert log。 同时保存更新前的信息。

因为是自动提交事务模式,所以2个update,会产生2个不同的trx_id。

真实的update log 记录的信息结构要复杂的多,会分更新主键,和不更新主键的情况。这里不详细展开。

这种一条条undo log 依据roll_pointer形成的链式结构,就是版本链。

undo log 存放在哪?

在MYSQL 5.6 之后,可以为undo log 分配独立的表空间。

默认表空间的数量为2个,可以设置innodb_undo_tablespaces 来增加数量。

每个表空间又被分为多个回滚段(rollback segment),回滚段的数量可以查看innodb_undo_logs。

每个回滚段就存放了undo log 页。

如果undo log 对应的事务都已经是执行完毕,或者回滚结束的。那么对应的undo log 空间就可以被回收了。

假设有一个长事务,迟迟未被提交,或回滚,那么undo log 会越来越大。严重的会直接导致服务器磁盘空间爆满。所以如果突然服务器磁盘空间使用量快速上升,也可以查看下是否有长事务没有提交,导致undo log占用很大磁盘空间。

总结

undo log 两大作用:

保障事务的原子性。事务中的所有更新语句,要么全被执行,要么全被回滚。通过将同一个trx_id 的undo log 就可以实现回滚同一事务的所有更新语句了。

提供版本链,支持MVCC。undo log 链为实现MVCC 提供了底层的物质基础。为了实现MVCC ,还需要借助Read View 。后续详细讲解MVCC中会详细聊到。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值