MySQL多版本并发控制机制(MVCC)-源码浅析 (3)

所以综合这两段代码,即在一个事务中,只有第一次运行select(不加锁)的时候才会创建一致性视图,如下图所示:

MySQL多版本并发控制机制(MVCC)-源码浅析


笔者构造了此种场景模拟过,确实如此。

MVCC和锁的同时作用导致的一些现象

MySQL是通过MVCC和二阶段锁(2PL)来兼顾性能和一致性的,但是由于MySQL仅仅在select时候才创建一致性视图,而在update等加锁操作的时候并不做如此操作,所以就会产生一些诡异的现象。如下图所示:

MySQL多版本并发控制机制(MVCC)-源码浅析


如果理解了update不走一致性视图(read_view),而select走一致性视图(read_view),就可以很好解释这个现象。
如下图所示:

MySQL多版本并发控制机制(MVCC)-源码浅析

总结

MySQL为了兼顾性能和ACID使用了大量复杂的机制,2PL(两阶段锁)和MVCC就是其实现的典型。幸好可以通过xcode等IDE进行方便的debug,这样就可以非常精确加便捷的追踪其各种机制的实现。希望这篇文章能够帮助到喜欢研究MySQL源码的读者们。

公众号

关注笔者公众号,获取更多干货文章:

MySQL多版本并发控制机制(MVCC)-源码浅析

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgwgj.html