聊聊undo log

什么是undo log

undo log回滚事务),在事务没有提交前,MySQL将记录更新操作的反向操作到undo log日志中,以便进行回退保证事务原子

undo log的作用

1.提供回滚操作

我们在进行数更新操作的时候,不仅会记录redo log,还会记录undo log,如果因为某些原因导致事务回滚,那么这个时候MySQL就要执行回滚rollback)操作,利用undo log将数据恢复到事务开始之前的状态

2、提供多版本控制(MVCC)

InnoDBMVCC实现是通过undo log来完成。当用户读取一行记录时,若该记录已经被其他事务占用当前事务可以通过undo log读取之前的行版本信息,以此实现非锁定读取

undo的存储结构

1.回滚段和undo页

innodb对undo log采用段的方式进行管理每个回滚段记录1024个undo log segment,在每个undo log segment进行undo页的申请

2.回滚段和事务

1.每一个事务只能有一个回滚段,一个回滚段可以同时服务多个事务

2.当事务提交时,innodb会做两件事:

回滚段中的数据分类

1、未提交的回滚数据:该回滚数据关联的事务尚未提交,要用于实现MVCC,所以不能被删除覆盖

2、已提交但未过期的回滚数据:该回滚数据关联的事务已提交,但仍然受到undo retention参数影响继续保留;

3、事务已提交并过期的数据:该回滚数据属于过期数据,当回滚段满之后,会被优先覆盖掉。

undo log的类型

InnoDB中,undo log分为两种:

详细生成过程

对于InnoDB来说,每条记录不仅包括了自身的数据,还包含了几个隐藏列:

在这里插入图片描述

新增操作的undo log

start transaction;
insert into user(name) values('Tom');
commit;

此时行记录deletemark标记为0,表示该记录并未删除,回滚指针指向了回滚编号为0的回滚日志,回滚日志记录了主键信息说明若要回滚操作可以通过执行delete这个主键实现

更新主键的undo log

start transaction;
update user set name = 'Sun' where id = 1;
commit;

此时执行了更新操作,并且更新的字段不是主键。此时记录的回滚指针指向了新生成的回滚编号为1的undo log编号为0的undo log连接编号为1的后面,当年记录回滚时也是先通过编号1的undo log恢复name'Tom',再通过编号0的undo log删除记录。

在这里插入图片描述

更新主键的undo log

start transaction;
update user set id = 2 where id = 1;
commit;

对于更新主键的操作,会先把原来的数据deletemark标识标记为1,这时并没有真正的删除数据,真正的删除会交给purge清理线程判断然后在后面插入一条新的记录,新的记录也会产生undo log,并且undo log的序号会递增。

在这里插入图片描述

此时的事务如何回滚?

  1. 通过undo no=3日志id=2的数据删除;
  2. 通过undo no=2日志id=1的数据的deletemark还原0;
  3. 通过undo no=1的日志把id=1的数据的name还原Tom
  4. 通过undo no=0的日志把id=1的数据删除。

删除操作的undo log

记录的删除操作分为两个阶段:

  1. 将记录的deletemark标示位设置为1,其他的不做修改(实际会修改记录的trx_idroll_pointer等隐藏列的信息)。
  2. 当该删除语句所在的事务提交之后,undo purge线程来真正的把记录删除掉。就是把记录从正常记录链表移除,加入到垃圾连表中。

删除操的undo log需要考虑对删除操作在阶段1所做的影响进行回滚,需要把该记录的trx_idroll_pointer的隐藏列旧值都记到对应undo log中的trx_idroll_pointer属性中。可以通过删除操作的undo logroll_pointer属性找到上一次对该记录改动产生的undo log,以此来实现回滚。

purage线程的作用

清理undo页和清除page里带有Delete_Bit标识的记录。在InnoDB中,事务中的delete操作并不会立刻将数据删除,而是先进行Delete Mark标记,给记录标识Delete_bit,真正的清除工作是由purge线程后台完成的

原文地址:https://blog.csdn.net/qq_62592925/article/details/134653848

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_12751.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注