事务日志undo log

事务日志undo log

image-20221227154243747

1 Undo日志的作用

作用1:回滚数据

逻辑上恢复,之前插入了一条数据,已经开辟了物理空间,回滚只是将该数据删除,物理空间还存在。

作用2:MVCC

image-20221227154603202

2 Undo存储结构

image-20221227155108744

mysql> show variables like 'innodb_undo_logs';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_undo_logs | 128 |
+------------------+-------+

3 Undo log 生命周期

image-20221227155943636

1 简要生成过程

image-20221227160244925

update age = 12 where id = 1; 原来age为10;

执行过程

  1. 执行更新操作时,先从buffer pool 中查找有没有对应的数据页,没有就从磁盘加载进 缓冲池。
  2. 记录undo log日志 age = 10
  3. 在内存中更新数据age=12
  4. 记录redo log日志到 redo buffer 中
  5. 由三种策略决定什么时候刷盘到 磁盘上
  6. 记录bin log 文件
2 详细过程

image-20221227161718608

image-20221227161922684

image-20221227163231392

执行update语句,分为两种情况

情况1 不更新主键

update user set name = 'Sun' where id =1

更改行记录中 tom 值为 sun

回滚指针指向 此次 undo log ,头插法。

image-20221227163257219

情况2 更新主键值

UPDATE user SET id=2 WHERE id=1;

将原来的标识为删除,在后面插入一条新的记录。同时记录下更新前id。

回滚指针ID是递增的

3 回滚过程

以上面的例子来说,假设执行rollback,那么对应的流程应该是这样:

  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的数据删除
4 undo log 的删除

针对于insert undo log 因为insert操作的记录,只对事务本身可见,对其他事务不可见。故该undo log可以在事务提交后直接删除,不需要进行purge操作。

针对于update undo log 该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除提交时放入undo log链表,等 待purge线程进行最后的删除。

image-20221227165755962

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值