Undo日志--mysql详解(十)
上篇文章说了redo日志是为了保证持久化,提高效率而产生的的,buffer pool有一个inndb buffer poll size来控制大小,并且默认128m,大于一个1g可以设置多个,但是每次同步持久化是随机I.O,redo log也有日志池,把随机io优化为顺序io,并且占用的地方小。
Undo日志
如何保证事务里的原子性,当数据执行到一半需要回滚,或者数据库发生宕机,这时候就需要保证事务原子性,所以回滚应该只有发生新增,修改,删除时候才考虑,select并没有回滚操作。
当在一个事务里,对数据做了改动,这时候就会给事务生成一个唯一的事务ID,生成的机制也跟row_id类似,会有一个全局的max_trx_id来维护,每次有新的数据就自增1。
这里除了trx_id外,还有roll_pointer,他本质上就是一个指针,指向对应的undo日志。
删除的时候如何记录的,这里比较特殊,之前我们说过页的page header存着delete mark,删除状态,在没提交之前,是先把状态修改,为什么会有这一步呢,是为了实现mvcc的功能。第二步提交之后,才会真的删除,这时候会把数据加入垃圾链表。这时候delete删除之后,会有一个old_roll_pointer指向之前的insert,组成版本链。
Update更新的时候分为两种情况,
一种是不更新主键的情况,这时候又分为更新的列长度是否发生变化,未发生,则就地更新,如果长度变化了,则会先删除之前的数据,再新增,重排序。
一种是更新主键的情况,会对该记录先进行delete mark操作,之后再插入新的数据,也就是说,每次都会产生两条undo log。
我们前面说过表空间是很多页组成,fil_page_index存储聚簇索引二级索引,
fil_page_type_fsp_hdr存储表空间头部信息,这里存的就是fil_page_undo_log。
Undo日志是分为两大类,一类是可以提交直接删除,一类还是为了mvcc服务。在undo日志中,每个页分类不同的链表连接起来,insert undo,update undo链表。
相关文章
- [android] 安卓自定义样式和主题
- [javaEE] 开源数据库连接池
- [javaEE] 数据库连接池和动态代理
- [android] 安卓消息推送的几种实现方式
- [android] 安卓进程优先级&为什么使用服务
- Mysql join left查询无法命中索引一例
- 2022-12-11:行程和用户。以下为输出结果,请问sql语句如何写? +------------+-------------------+ | Day |
- Valentina Studio Pro mac/win(数据库管理器)最新版
- 10个人9个答错,另外1个只对一半:数据库的锁,到底锁的是什么?
- (一)Mysql基础
- (二)Mysql基本操作
- (三)SQL语言基础
- (五)SQL运算符
- 数据库运维 | 携程分布式图数据库NebulaGraph运维治理实践
- Oracle连接工具PLSQL登录时提示初始化失败,无法锁定OCI.dll错误解决
- SQL 入门篇之什么是别名?
- SQL ALTER TABLE 语句
- SQL AND & OR 运算符
- SQL BETWEEN 操作符
- MYSQL 不同的表格式,导致不同的存储空间消耗和性能差异 横向评测