undo log版本链
就是多个事务串行执行的时候,每个人修改了一行数据,都会更新隐藏字段txr_id和roll_pointer,同时之前多个数据快照对应的undo log,会通过roll_pinter指针串联起来,形成一个重要的版本链
ReadView机制
undo log多版本链条实现的ReadView机制
你执行一个事务的时候,就给你生成一个ReadView,实现数据的隔离级别
- 一个是m_ids,这个就是说此时有哪些事务在MySQL里执行还没提交的;
- 一个是min_trx_id,就是m_ids里最小的值;
- 一个是max_trx_id,这是说mysql下一个要生成的事务id,就是最大事务id;
- 一个是creator_trx_id,就是你这个事务的id
通过这套ReadView+undo log日志链条的机制,就可以保证事务A不会读到并发执行的事务B更新的值,只会读到之前最早的值




每次事务执行,都有生成一个 ReadView,undo log日志链
每次查询都从undo log日志链中找到 trx_id,找到 ReadView中
min_trx_id > trx_id 是事务发起前,已经提交的
max_trx_id < trx_id 是事务发起后,新发起的事务且以提交,(不是我们要的)
找到 m_ids 中包含的 trx_id 是mysql正在执行还没提交的事务
所以 找到 (min_trx_id >= trx_id && m_ids 包含查询的事务id )
undo log日志链中最先服务条件的那个记录
RC(读已提交)隔离级别的实现
read committed(读已提交) 不会发生脏写和脏读, 可能会发生不可重复读和幻读 简称RC
当你一个事务设置他处于RC隔离级别的时候,他是每次发起查询,都重新生成一个ReadView
事务B提交前 第一次 查询
事务B提交后 第二次查询
m_ids 中包括
找到 (trx_id
undo log日志链中最先服务条件的那个记录
RR(可重复读)隔离级别的实现
repeatable read(可重复读) 不会发生脏写、脏读和不可重复读的问题 简称RR
m_ids 中包括
找到 (trx_id <=min_trx_id && m_ids 包含查询的事务id )undo log日志链中最先服务条件的那个记录
