一、Undo Log的作用
之前讲过回滚日志-undo log,现在我们对undo log回滚原理再进行深入了解。如果一个事务里有4个增删改操作,结果已经执行了2个增删改并且buffer pool里的数据已经被修改了,但是剩下的俩个增删改还没有执行,此时事务回滚了怎么办?但是如何回滚呢?所以在执行事务的时候,需要用到undo log回滚日志。
undo log日志里面主要记载了与你操作相反的sql,例如:执行的是delete语句,那么就要把删除的那条数据记录下来,如果要回归,就应该执行一条insert语句,把数据插回去。如果是select语句就不会进入undo log中,只有insert、update、delete语句才会写入undo log日志中。
二、Undo Log日志文件内容
上一节将了redo log日志文件的内容,这里自然少不了undo log日志文件内容的简介。我们就以insert语句为例。insert语句的undo log的类型是:TRX_UNDO_INSERT_REC。这个undo log日志文件中包含了以下一些东西:
这条日志开始位置:日志开始的地址
主键的各列长度和值:你操作这条数据的主键的每个列,他的长度是多少,具体的值是多少,即使你没有设置主键,mysql自己也会给你弄一个row_id作为隐藏字段,作为你的主键。
表id:每个表属于自己的id,记录下来是在哪个表里插入数据
undo log日志编号:每个undo log都有自己的编号
undo log 日志类型:TRX_UNDO_INSERT_REC,insert语句的undo log日志类型。
这条日志的结束位置:日志结束的地址
所以,之前俩个语句已经执行,但是要回滚还有俩个语句没有执行怎么办?现在只需要执行一下undo log日志里面的语句,就可以将数据进行回滚了。
借道友法力一用:
========================== stay hungry stay foolish =============================