- 背景:数据库的并发场景下,当读和写并发时,该读到什么样的数据,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....