Mysql MVCC

MVCC多版本并发控制本质就是每个事务读到的不是同一个正在被修改的数据,而是自己对应的历史版本快照。所以多个事务既然同时读又能同时写,读写互不阻塞,这就是数据库高并发的秘密武器。那历史版本怎么来的,是通过undo log ,数据库中只存了最新的一条记录,然后通过undo log记录反向操作(如insert一条数据,就在undo log中delete一条数据,update一条数据就在undo log留旧值),所以需要老版本时只要顺着这些日志往回找就可以,所以一条记录和undo log就串成了一条版本链。

那么当前事务可以看到版本链的哪一条呢?这就要通过ReadView,它会记录哪些事务已经提交,哪些还活跃,然后按照一套规则决定这个版本你能不能看。(具体就是自己改的永远能看,比自己再提交的能看,还没提交的不能看)

在不同隔离级别下的区别:读已提交每次查询都会重新生成一个ReadView,所以前后两次select的结果可能不一样就,也就是不可重复读;而可重复读只在第一次查询时生成ReadView后面一直直接用这个快照,所以整个事务多次查询结果保持一致,这就是可重复读。

总结,MVCC的核心是快照读,Undo log是历史版本的支撑,ReadView决定谁能看那个版本

相关推荐
能鈺CMS21 分钟前
能鈺CMS · 虚拟发货源码
java·大数据·数据库
泡沫·33 分钟前
4.iSCSI 服务器
运维·服务器·数据库
胡八一37 分钟前
解决PHP未检测到您服务器环境的sqlite3数据库扩展报错
服务器·数据库·php
Wang's Blog1 小时前
MongoDB小课堂: 游标操作与文档投影技术深度解析
数据库·mongodb
q***42051 小时前
使用Django Rest Framework构建API
数据库·django·sqlite
共享家95272 小时前
QT-界面优化(下)
开发语言·数据库·qt
maray2 小时前
Chroma 的设计哲学
数据库·人工智能
e***0962 小时前
SQL 中UPDATE 和 DELETE 语句的深入理解与应用
数据库·sql
程序员小白条4 小时前
你面试时吹过最大的牛是什么?
java·开发语言·数据库·阿里云·面试·职场和发展·毕设
老华带你飞4 小时前
社区养老保障|智慧养老|基于springboot+小程序社区养老保障系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序·毕设·社区养老保障