简介:
- MVCC多版本并发控制,基于快照读实现,提供了mysql非阻塞读,主要依赖的undolog、readview和三个隐式字段。undolog主要用来做回滚的,三个隐式字段分别为隐藏主键、回滚指针、事务id,实现快照读主要依赖readview。
快照读和当前读
- 快照读就是简单的查询语句
- 当前读包含select … for update、select … lock in share model、insert、update、delete。
readview:
- MVCC快照读的主要依据,它包含四个核心字段
-
- m_ids:创建快照读时活跃的事务id(所有未提交或回滚的事务id)列表
-
- min_trx_id:m_ids列表中最小的事务id
-
- max_trx_id:预分配事务id,m_ids列表中最大事务id+1
-
- creator_trx_id:当前创建快照的事务id
- MVCC是如何判断某个版本是否可见的?
-
- 如果该版本的事务id等于creator_trx_id,表示当前该版本事务在访问自己修改过的数据,可以访问。
-
- 如果该版本的事务id小于min_trx_id,表示该版本在生成视图前已经提交了,可以访问。
-
- 如果该版本的事务id大于等于max_trx_id,表示该版本的事务是在创建视图后才开启了,不可以访问。
-
- 如果当前版本的事务id在m_ids列表中,表示该版本的事务在创建视图时还在活跃,不可以访问。
-
- 如果当前版本大于min_trx_id且小于max_trx_id且不在m_ids中,表示创建视图的时候已经提交,可以访问。
- MVCC如何通过readview实现隔离级别?
-
- read commit:每次快照读都会创建一个视图。
-
- repeated read:开启事务后第一个快照读的时候创建的视图,后续沿用该视图。
mysql如何在可重复读的隔离级别下解决了幻读?
- 对当前读使用了间隙锁解决了幻读
- 快照读因为是开启事务时创建了视图,后续的插入并不会影响当前视图的数据,解决了幻读