【IT老齐030】MySQL MVCC机制
【IT老齐030】MySQL MVCC机制
在MySQLInnoDB存储引擎下,RC、RR基于MVCC(多版本并发控制) 进行并发事务控制
MVCC是基于“数据版本”对并发事务进行访问
场景
UNDO_LOG版本链
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
RR
可重复读(RR):仅在第一次执行快照读时生成ReadView,后续快照读复用
连续多次快照读,ReadView会产生复用,没有幻读问题
特例:当两次快照读之间存在当前读,ReadView会重新生成并且当前读覆盖到其他事务新增的数据,导致产生幻读。早期版本此情况还存在不可重复读,现在通过加锁解决