![](https://img.haomeiwen.com/i4031144/a7ad371a7f3c7235.png)
![](https://img.haomeiwen.com/i4031144/05a02f8d92556c9c.png)
insert操作对应的undo log记录
当我们向某个表中插入一条记录时,实际上需要向聚簇索引和所有的二级索引都插入一条记录。不过记录undo日志时,我们只需要考虑向聚簇索引插入记录时的情况就好了,因为其实聚簇索引记录和二级索引记录是一一对应的,我们在回滚插入操作时,只需要知道这条记录的主键信息,然后根据主键信息做对应的删除操作,做删除操作时就会顺带着把所有二级索引中相应的记录也删除掉。后边说到的DELETE操作和UPDATE操作对应的undo日志也都是针对聚簇索引记录而言的,我们之后就不强调了。
实际上insert undo只在事务回滚时起作用,当事务提交后,该类型的undo日志就没用了,它占用的Undo Log Segment也会被系统回收(也就是该undo日志占用的Undo页面链表要么被重用,要么被释放)。虽然真正的insert undo日志占用的存储空间被释放了,但是roll_pointer的值并不会被清除,roll_pointer属性占用7个字节,第一个比特位就标记着它指向的undo日志的类型,如果该比特位的值为1时,就代表着它指向的undo日志类型为insert undo。
事务中执行dellete语句到事务提交对对应记录的改动(也就是是怎么进行删除的)
![](https://img.haomeiwen.com/i4031144/1935d0052777b4cb.png)
delete mark
阶段这个中间状态主要是为了实现一个称之为MVCC的功能
![](https://img.haomeiwen.com/i4031144/8a8be993e403b0c1.png)
在删除语句所在的事务提交之前,只会经历阶段一,也就是delete mark阶段(提交之后我们就不用回滚了,所以只需考虑对删除操作的阶段一做的影响进行回滚)。
在delete mark
阶段之前会生成undo日志。
TRX_UNDO_DEL_MARK_REC类型的undo日志结构
![](https://img.haomeiwen.com/i4031144/86b8ea4f478b16c8.png)
在对一条记录进行delete mark
操作前,需要把该记录的旧的trx_id和roll_pointer隐藏列的值都给记到对应的undo日志中来,就是我们图中显示的old trx_id和old roll_pointer属性。
![](https://img.haomeiwen.com/i4031144/d37839f7639d2cc0.png)
根据TRX_UNDO_DEL_MARK_REC类型的undo日志进行回滚
//todo 这里画一个版本链的图:一条记录被事务10修改了,并且事务10提交了,删除事务20才得以进行,并且是怎么根据版本链进行rollback的。
更新操作
![](https://img.haomeiwen.com/i4031144/5c71a60f0f08e9a9.png)
对记录进行更新操作的一个例子
![](https://img.haomeiwen.com/i4031144/f7f946d9cf7d3c99.jpg)
网友评论