参考:https://mp.weixin.qq.com/s/R3yuitWpHHGWxsUcE0qIRQ,文中例子截取自上文
redo、undo、回滚段
- redo:主要解决如果每次修改数据都去磁盘上随机读写,效率很低。所以改为顺序写入到redo日志中然后定期去修改磁盘。即使是数据库奔溃也可以依靠redo重做。保证事务的acid
- undo:在事务提交之前,会将修改的旧数据存放到undo日志中,新数据记录到redo中。可以利用undo日志来回滚。
- 回滚段:存储undo日志的地方
- 下面是一个例子,很清楚的说明其中的关系
innodb实现多版本并发控制
- 关键:旧版本数据存放在回滚段中,同时这种架构对mysql冲击不大
- 每行数据会记录:
- DB_TRX_ID,最近一次修改它的事务ID;
- DB_ROLL_PTR,指向undo的指针;
- DB_ROW_ID,单调递增的行ID;
- 通过这种方式就可以再undo中获取到历史数据的快照,叫快照读
- 一般情况下select语句直接读快照,当然也可以获取排它锁