版本链
事务中进行更新操作,都会被记录在undo日志中。记录的内容除了id之外还有事务id和下一条记录的指针等。
READ COMMITTED —— 每次读取数据前都生成一个ReadView
隔离级别为READ COMMITTED的事务,每次查询select操作时,会生成一个视图,生成视图的时候会判断目前哪些事务还处于活跃状态,即未提交,这个会保存在一个列表中,然后从版本链中从上至下找到第一条不在这个列表里的记录,即最后一条已经提交的记录。
REPEATABLE READ —— 在第一次读取数据时生成一个ReadView
隔离级别为REPEATABLE READ 的事务,只会在第一次执行查询语句的时候生成一个视图,之后就不会重复生成了。
小结
所谓的MVCC
(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用READ COMMITTD
、REPEATABLE READ
这两种隔离级别的事务在执行普通的SEELCT
操作时访问记录的版本链的过程,这样子可以使不同事务的读-写
、写-读
操作并发执行,从而提升系统性能。READ COMMITTD
、REPEATABLE READ
这两个隔离级别的一个很大不同就是:生成ReadView的时机不同,READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。