【IT老齐030】MySQL MVCC机制

【IT老齐030】MySQL MVCC机制

在MySQLInnoDB存储引擎下,RC、RR基于MVCC(多版本并发控制) 进行并发事务控制

MVCC是基于“数据版本”对并发事务进行访问

场景

1709644582775

UNDO_LOG版本链

1709644707505

UNDO LOG版本链不是立即删除,MySQL确保版本链数据不再被“引用”后再进行删除

ReadView

ReadView是“快照读”SQL执行时MVCC提取数据的依据

ReadView是一个数据结构,包含4个字段

  • m_ids:当前活跃的事务编号集合
  • min_trxid:最小活跃事务编号
  • max_trx_id:预分配事务编号,当前最大事务编号+1
  • creator_trx_id:ReadView创建者的事务编号
  • 快照读就是最普通的Select查询SQL语句 RR使用MVCC
  • 当前读指代执行下列语句时进行数据读取的方式 RR使用间隙锁
    • Insert、Update、Delete.
    • Select...for update
    • Select...lock in share mode

实例

版本链-活跃事务+本事务=所有可访问数据

RC

读已提交(RC):在每一次执行快照读时生成ReadView

1709645432787

1709645506941

1709645910157

RR

可重复读(RR):仅在第一次执行快照读时生成ReadView,后续快照读复用

1709646045826

连续多次快照读,ReadView会产生复用,没有幻读问题
特例:当两次快照读之间存在当前读,ReadView会重新生成并且当前读覆盖到其他事务新增的数据,导致产生幻读。早期版本此情况还存在不可重复读,现在通过加锁解决

1709646213615

posted @ 2024-03-14 20:00  Faetbwac  阅读(4)  评论(0编辑  收藏  举报