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中记录事务号及事务发生前的信息。
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中的相关修改给恢复回去。