Mysql MVCC

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

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

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

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

相关推荐
alonewolf_998 分钟前
深入剖析MySQL锁机制与MVCC原理:高并发场景下的数据库核心优化
数据库·mysql
一 乐31 分钟前
绿色农产品销售|基于springboot + vue绿色农产品销售系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·宠物
黄宝康38 分钟前
sqlyog密钥亲测有效
mysql
Codeking__39 分钟前
Redis初识——什么是Redis
数据库·redis·mybatis
YIN_尹40 分钟前
【MySQL】数据类型(上)
android·mysql·adb
k***1951 小时前
Spring 核心技术解析【纯干货版】- Ⅶ:Spring 切面编程模块 Spring-Instrument 模块精讲
前端·数据库·spring
程序员黄老师1 小时前
主流向量数据库全面解析
数据库·大模型·向量·rag
Full Stack Developme1 小时前
Redis 可以实现哪些业务功能
数据库·redis·缓存
rgeshfgreh1 小时前
Spring事务传播机制深度解析
java·前端·数据库
无名-CODING1 小时前
Java Spring 事务管理深度指南
java·数据库·spring