MVVC(Multi-Version Concurrency Control)是一种多版本并发控制协议,只有在InnoDB存储引擎下存在。MVVC是为了实现事务间的隔离,通过版本号,去避免同一数据在不同事务间的竞争。里面用到一个主要的东西就是Read View这个Read View有四个重要的字段,一个是当前活跃且未提交的事务的列表,一个是当前活跃且未提交中事务中最小的事务id,一个是给下一个事务的id,最后一个是当前事务的事务id。MVVC只在读已提交和可重复读有效,且要与数据库中每条记录的版本编号trx_id,也就是上一次修改过数据的事务id还有undo log配合使用。 在可重复读下,事务启动时会生成一个Read View,假设数据库中某一条数据的版本编号是50,然后现在有两个事务开启,51和52,那么就有两个Read View,里面的事务列表是51和52,假如这时52改了那条记录并提交了,那版本编号就变为52了,那这时51再来看的时候,发现版本编号变成了52了,比自己都大,那就不取,沿着undo log找上一个版本,也就是50的数据。这样的话,对应51来说,即使数据变动了,但它还是找到它一开始的那个记录,这就是可重复读。 而在读已提交下,当52修改了数据后提交事务,那么52就不再事务列表当中了,此时51去看那条记录,它看到版本编号是52,比自己大,再去看事务列表,发现找不到52,那么就意味着52已经提交了,那么此时51就会直接读取这个版本编号是52的数据。