前情提要
为了在事务提交前,随时能够回滚缓存页中已经修改的数据,就需要用undolog来记录之前的改动情况。新增操作就对应着一个删除操作来回滚,删除操作也有对应的一个新增操作。更新操作也有对应的更新操作。
回滚类型
undolog根据操作类型分为3种类型。
新增
类型:TRX_UNDO_INSERT_REC
内容:
- 日志开始位置
- 主键的各列长度和值(可能是联合主键)
- 表id
- undolog日志编号
- undolog日志类型
- 日志结束位置
操作:
在回滚时,通过获取主键的值以及表id可以直接定位到对应的缓存页,从里面删除之前插入的数据
删除
更新
如果更新的条件是主键列,则删除行然后添加一条记录。
如果更新的条件不是主键列,则进行反向更新。
undolog版本链
在03.数据在磁盘上的存储中,说到了数据在磁盘上的存储格式,其中就包含了隐藏字段:DB_TRX_ID和DB_ROLL_PTR。
- DB_TRX_ID:最近一次更新这条数据事务的ID
- DB_ROLL_PTR:更新这个事务之前生成的undolog
通过这2个隐藏字段,就可以在多事务并发访问下,保证数据的串行修改。