- 背景:数据库的并发场景下,当读和写并发时,该读到什么样的数据,mvcc就呈现了,不过它只反对Read-Commited和Repeatable-Read两种事务隔离级别. 写写并发和读读并发比较简单,一个加锁,一个不必管.
- 前提条件1:select for update属于以后读,单纯不加for update的select是快照读. 以后读是须要锁的,行锁或者间隙锁,mvcc是无锁的解决快照读的计划
- 前提条件2:db的crud都会当时申请一个事务编号,由数据库治理,递增,这个事务编号会在ReadView里呈现.
- 波及到的元素:版本链:一条数据有隐含字段:最新更新的事务id,undolog的指针;undolog:更新前,把历史数据保留的中央;ReadView:蕴含以后为提交事务id数组,以及该数组中最小/下一个事务id.
- 版本链+undolog:回滚时应用
- 版本链+ReadView:mvcc外围逻辑.
- 外围逻辑:从版本链里找一个 已提交的事务id那条记录,就是能够读到的数据.
- RR和RC的区别:RR是可反复读,所以ReadView要保持一致,也就是每次读都应用第一次读时创立的ReadView.RC就是每次读都创立ReadView,因为读之间可能会产生数据提交.
- 参考:https://www.bilibili.com/video/BV1hL411479T/?spm_id_from=333....