MySQL undo日志

20 undo日志事务的回滚需求事务需要保证原子性,如果事务的执行过程,服务器发生了错误,就需要将事务进行回滚(对部分语句进行回滚,对整个事务进行回滚)。InnoDB把为了回滚而记录的东西称为undo日志,对数据库进行改动(insert、delete、update)操作时,就需要进行记录,不同的操作类型产生的undo日志的格式是不一样的。插入操作,记录主键值回滚时只需要根据主键值将相应的记录删除删除操作,把记录的内容记录,回滚时把删除前记录的内容重新插入事务Id分配Id的时机读写
摘要由CSDN通过智能技术生成

MySQL知识总结

在 Github 上查看

《MySQL是怎样运行的》知识总结

单表访问方法

表的连接原理

优化 基于查询成本的优化

优化需要的统计数据

优化 基于规则的优化

Explain详解

InnoDB缓冲区

事务

redo日志

undo 日志

MVCC原理

MySQL 锁

20 undo日志

事务的回滚需求

事务需要保证原子性,如果事务的执行过程,服务器发生了错误,就需要将事务进行回滚(对部分语句进行回滚,对整个事务进行回滚)。

InnoDB把为了回滚而记录的东西称为undo日志,对数据库进行改动(insert、delete、update)操作时,就需要进行记录,不同的操作类型产生的undo日志的格式是不一样的。

  • 插入操作,记录主键值,回滚时只需要根据主键值将相应的记录删除
  • 删除操作,把记录的内容记录,回滚时把删除前记录的内容重新插入

事务Id

分配Id的时机

  • 读写事务,只有在它第一次对某个表执行改动操作时,才分配事务Id
  • 只读事务,只能对临时表进行改动操作
  • 如果不为事务分配Id,则事务Id为默认值0。

事务Id的生成

事务Id与隐藏列row_id的分配策略类似,MySQL会维护一个全局变量,为事务分配Id后,就自增1,当它的值为256的倍数时,就会刷新到系统表空间页号为5的页面属性Max Trx ID(占8字节)中。

系统启动时,会将这个属性加载到对应的全局变量并加上256,这样就保证事务Id是递增的。

记录的隐藏列

聚簇索引的记录除了会有用户定义的列外,还会有额外的隐藏列

  1. row_id:作为主键Id(如果表中没有主键、或不可为Null的唯一索引)
  2. trx_id:事务Id
  3. roll_pointer:回滚指针,指向记录对应的undo日志

undo日志的格式

为了保证事务的原子性,InnoDB在对记录进行改动操作时,需要创建相应的undo日志,一个事务执行过程中,可能会新增、修改、删除多条记录,所以需要记录多条undo日志,undo日志会从0开始编号。

undo日志会存储在fil_page_undo_log类型的页面中。

插入操作的undo日志

插入一条记录的结果是记录被加入到数据页中,在创建对应undo日志时,只需要把这条记录的主键值记录下来,如果要回滚插入操作,只需要根据对应的主键值对记录进行删除操作。

trx_undo_insert_log类型的undo日志

  1. end of record:本条记录的结束(即指向下一条日志开始)
  2. undo type:日志的类型
  3. undo no:日志对应的编号,一个事务中,日志编号从0开始,事务没提交,事务中产生的undo日志的编号递增1
  4. table id:日志记录对应的表的Id
  5. 主键列的信息列表:<列占用的字节数,对应的值>
  6. start of record:本条记录的开始(即指上一条日志结束)

提示

向表插入记录时,实际上需要向聚簇索引、所有的二级索引都插入记录,不过,只需要针对主键值创建1条undo日志,在回滚插入操作时,只需要知道这条记录的主键信息,根据主键信息对聚簇索引、二级索引相应的记录删除。

InnoDB对undo日志的某些属性进行了压缩处理。

删除操作的undo日志

插入到数据页面的记录会根据记录头信息next_record组成一个单向链表(正常记录链表)。

被删除的记录是根据next_record属性组成了垃圾链表,数据页结构Page Header中有属性page_free指向垃圾链表的头节点

删除操作的2个阶段

  1. delete mark:将记录的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值