后悔了怎么办 - undo日志
一、undo日志
概念: 把回滚时所需的东西都给记下来
二、事务id
- 给事务分配id的时机
(1)对于只读事务来说,只有在它第一次对某个用户创建的临时表执行增、删、改操作时才会为这个事务分配一
个 事务id ,否则的话是不分配 事务id 的。
(2)对于读写事务来说,只有在它第一次对某个表(包括用户创建的临时表)执行增、删、改操作时才会为这个
事务分配一个 事务id ,否则的话也是不分配 事务id 的。 - 事务id是怎么生成的
步骤有三:
(1)服务器会在内存中维护一个全局变量,每当需要为某个事务分配一个 事务id 时,就会把该变量的值当作 事
务id 分配给该事务,并且把该变量自增1。
(2)每当这个变量的值为 256 的倍数时,就会将该变量的值刷新到系统表空间的页号为 5 的页面中一个称之为
Max Trx ID 的属性处,这个属性占用 8 个字节的存储空间。
(3)当系统下一次重新启动时,会将上边提到的 Max Trx ID 属性加载到内存中,将该值加上256之后赋值给我们
前边提到的全局变量(因为在上次关机时该全局变量的值可能大于 Max Trx ID 属性值)。
这样就可以保证整个系统中分配的 事务id 值是一个递增的数字。先被分配 id 的事务得到的是较小的 事务id ,
后被分配 id 的事务得到的是较大的 事务id 。 - trx_id隐藏列
概念:是某个对这个聚簇索引记录做改动的语句所在的事务对应的 事务id - undo日志的格式
(1)INSERT操作对应的undo日志
(2)DELETE操作对应的undo日志
(3)UPDATE操作对应的undo日志
INSERT操作对应的undo日志如下:
roll_pointer隐藏列:roll_pointer 本质就是一个指针,指向记录对应的undo日志,如图: