undo log在acid中保证a的作用, 同时对c和i也有一定的作用。
undo log在mysql5.7版本中还是存在于ibdata1中的,8.0后有单独的存放文件。
加入undo后事务的递交流程总结:
0. begin执行开启事务时会产生一个TXID(事务号)
1. 把事务中涉及到的数据行所在ibd page页整个16kb大小的内容及LSN号加载到data buffer poll中
2. 修改data buffer poll中的数据及LSN号累加1.
3. 在undo log中记录事务号及事务发生前的信息(该记录生成优先于data buffer poll中数据改动)。
4. redo log buffer缓冲区中会记录data buffer poll中的数据变化日志,LSN号,事务号
5. commit时, mysql的WAL机制使日志优先于数据入盘(即redo log中, 含LSN号, 事务号),
此时事务号会被标记为已递交(入盘数据还包含其它未递交事务), 返回事务成功提示。
6. 此时undo log中会把该事务号及变更信息打上标记,表示可以被其它信息覆盖了
如果发生rollback回滚操作
接上面的0-4步骤,简述rollback命令后发生的变更
5. rollback后该事务号相关信息从undo log中undo log buffer中(这里就是事务开始前的数据),
使用undo log buffer中的数据再把data buffer poll中的相关修改给恢复回去。
总结:
1. redo log buffer刷写到redo log机制其中有一种是,当一个事务被递交会附带把此时正进行的未递交
事务一起记录到redo log中,一起写入的有变更日志,LSN号,事务号等信息。且会把已递交的事务号
标记未已递交,未递交的事务号标记为未递交。
2. 此时如果宕机,三个磁盘文件的状态分析如下(数据还未写会ibd中,lsn号也未变更):
undo log中记录有事务号,及该事务开始时的数据
ibd文件中记录有LSN号
redo log中记录有LSN号,事务号及事务状态,数据变更日志,且此时的LSN号和ibd中不一致
3. 数据库启动后校验ibd和redo log中的LSN号,发现有不一致的,触发CSR机制把两者加载到各自对应的buffer中
使用redo log buffer信息构造出宕机前的脏页信息。
4. 此时自动触发CSR的第二个机制,检查redo log中的事务号及事务状态,拿事务状态是未递交的事务号到undo log中
把对应的事务信息加载到undo buffer中后使用它把data buffer poll中脏页内未递交事务数据恢复到事务开启之前
5. 触发CKPT机制,把脏页数据刷写到ibd中
补充: 以上每步中对数据的变更LSN号都会伴随着被一起修改和记录。
undo的功能总结:
1. 记录了数据修改之前的状态
2. rollback时把data buffer poll中的数据修改恢复到修改之前;
3. 在CSR中实现未递交数据的回滚操作;
4. 实现一致性快照,保证MVCC(多版本并发控制,同一行数据的读写不会互相阻塞),
同一行的读不影响写,写也不影响读。