(目录)
MySQL MVCC机制
1.隔离级别
在MySQL InnoDB存储引擎下,RC、RR基于MVCC(多版本并发控制)进行并发事务控制
MVCC是**基于”数据版本”**对并发事务进行访问
2.场景分析
UNDO_LOG不是会被删除吗?中间数据万一被删了版本链不就断了?
UNDO_LOG版本链不是立即删除,MySQL确保版本链数据不再被“引用”后再进行删除
ReadView
ReadView是“快照读”SQL执行时MVCC提取数据的依据.
快照读就是最普通的Select查询SQL语句
当前读指代执行下列语句时进行数据读取的方式
Insert、Update、Delete、
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匹配条件规则
- 如果数据事务ID
trx_id < min_limit_id
,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。 - 如果
trx_id>= max_limit_id
,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。 - 如果
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
4.可重复读(RR):仅在第一次执行快照读时生成ReadView,后续快照读复用
RR级别下使用MVCC能避免幻读吗
?
标签:事务,快照,ReadView,trx,MVCC,MySQL,id From: https://blog.51cto.com/panyujie/8195803能,但不完全能!
- 连续多次快照读,ReadView会产生复用,没有幻读问题
- 当两次快照读之间存在当前读,ReadView会重新生成,导致产生幻读
MVCC 只能保证用户并发修改数据时的快照读