undo log版本链

就是多个事务串行执行的时候,每个人修改了一行数据,都会更新隐藏字段txr_id和roll_pointer,同时之前多个数据快照对应的undo log,会通过roll_pinter指针串联起来,形成一个重要的版本链
image.png

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更新的值,只会读到之前最早的值
image.png
image.pngimage.png
image.pngimage.png
每次事务执行,都有生成一个 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提交前 第一次 查询
image.png

事务B提交后 第二次查询
image.png
m_ids 中包括
找到 (trx_id 或者(trx_id <=min_trx_id && m_ids 包含查询的事务id
undo log日志链中最先服务条件的那个记录

RR(可重复读)隔离级别的实现

repeatable read(可重复读) 不会发生脏写、脏读和不可重复读的问题 简称RR
m_ids 中包括
找到 (trx_id <=min_trx_id && m_ids 包含查询的事务id )undo log日志链中最先服务条件的那个记录