0
点赞
收藏
分享

微信扫一扫

【MySQL】MVCC机制、ReadView数据结构、匹配规则详解

(目录)

MySQL MVCC机制

image-20230701150505357

1.隔离级别

img

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

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

2.场景分析

img

img

img

UNDO_LOG不是会被删除吗?中间数据万一被删了版本链不就断了?

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

ReadView

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

快照读就是最普通Select查询SQL语句

当前读指代执行下列语句时进行数据读取的方式

InsertUpdateDelete

Select...for update

Select...lock in share mode

1.ReadView数据结构

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

  • m_ids:当前活跃的事务编号集合
  • min_trx_id:最小活跃事务编号
  • max_trx_id:预分配事务编号,当前最大事务编号+1
  • creator_trx_id:ReadView创建者的事务编号

2.Read view匹配条件规则

  1. 如果数据事务ID trx_id < min_limit_id,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。
  2. 如果trx_id>= max_limit_id,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。
  3. 如果 min_limit_id =<trx_id< max_limit_id,需腰分3种情况讨论
  • (1).如果m_ids包含trx_id,则代表Read View生成时刻,这个事务还未提交,但是如果数据的trx_id等于creator_trx_id的话,表明数据是自己生成的,因此是可见的。
  • (2)如果m_ids包含trx_id,并且trx_id不等于creator_trx_id,则Read View生成时,事务未提交,并且不是自己生产的,所以当前事务也是看不见的;
  • (3).如果m_ids不包含trx_id,则说明你这个事务在Read View生成之前就已经提交了,修改的结果,当前事务是能看见的。

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

img

imgimg

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

img

RR级别下使用MVCC能避免幻读吗

能,但不完全能!

  1. 连续多次快照读,ReadView会产生复用,没有幻读问题
  2. 当两次快照读之间存在当前读,ReadView会重新生成,导致产生幻读
  3. MVCC 只能保证用户并发修改数据时的快照读

img

举报

相关推荐

0 条评论