共计 590 个字符,预计需要花费 2 分钟才能阅读完成。
- 背景: 数据库的并发场景下, 当读和写并发时, 该读到什么样的数据,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….
正文完