undolog保证了事务的原子性(主要用于回滚操作)

聚簇索引行格式(包含了trx_id,roll_ptr)
image.png

事务 id

给事务分配 id 的时机

一个事务可以是一个只读事务,或者是一个读写事务

在只读事务中不可以对普通的表(其他事务也能访问到的表)进行增、删、 改操作,但可以对用户临时表做增、删、改操作。在读写事务中可以对表执行增删改查操作。
如果某个事务执行过程中对某个表执行了增、删、改操作,那么 InnoDB 存储引擎就会给它分配一个独一无二的事务 id,分配方式如下:
对于只读事务来说,只有在它第一次对某个用户创建的临时表执行增、删、改操作时才会为这个事务分配一个事务 id,否则的话是不分配事务 id 的。
对于读写事务来说,只有在它第一次对某个表(包括用户创建的临时表)执行增、删、改操作时才会为这个事务分配一个事务 id,否则的话也是不分配事务
id 的。(临时表指的不是执行语句产生的内部临时表,是指用户创建的临时表)

roll_pointer 本质上就是一个指向记录对应的 undo 日志的一个指针。比方说
我们向表里插入了 2 条记录,每条记录都有与其对应的一条 undo 日志。记录被
存储到了类型为 FIL_PAGE_INDEX 的页面中(就是我们前边一直所说的数据页),
undo 日志被存放到了类型为 FIL_PAGE_UNDO_LOG 的页面中。
roll_pointer 本质就是一个指针,指向记录对应的 undo 日志。

innodb对针对很多操作都设计了undo日志格式,一般来讲一个操作会产生一条或多条undo日志(TRX_UNDO_UPD_EXIST_REC 的 undo
日志,只产生一条)
比如: update 不更新主键 情况下:1.列的存储空间不变,就地更新,变化则直接真正的删除然后重新插入
更新主键的情况下,先delete再insert(TRX_UNDO_DEL_MARK_REC(会走deleteMark操作),TRX_UNDO_INSERT_REC两种undo日志)