个人理解仅供参考,只讨论mysql的innoDB。
1、MVCC是什么
MVCC多版本并发控制,是mysql数据库的并发访问的解决方案(不同隔离级别,在不同程度上解决脏读、不可重复读、幻读等问题)。
2、MVCC怎么实现
通过数据库隐藏字段、undo log、read view机制实现的。
2.1 隐藏字段:DB_TRX_ID 事务id、DB_ROLL_PTR 回滚指针、 DB_ROW_ID 没有主键的时候默认行id
2.2 undo log是什么:
undo log 是存的历史版本的行数据。(快速理解:隐藏字段把数据加宽,undo log相当于把数据加长。以时间顺序用指针把各个版本的数据连接好。)
2.3 read view机制在MVCC中起到什么作用
read view维护一个list<事务id>,用来记录当前哪些事务在执行,从而判断当前应该读取哪个版本的数据。
2.4 怎么解决不可重读读的问题
读已提交隔离级别每次查询都是不同的read view
可重复读隔离级别同一个事务同样的查询是同一个read view,从而解决不可重读读的问题。
3、MVCC解决了幻读问题吗
问题修正:应该是说MVCC的可重复读隔离级别有没有解决幻读问题,如果是序列化隔离级别肯定解决了。
通过间隙锁,解决了绝大部分幻读问题。