Mysql MVCC

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

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

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

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

相关推荐
珊珊而川19 小时前
MAC-SQL 算法一
数据库·sql·oracle
听风吟丶19 小时前
深入解析 Spring Boot 自动配置:原理、实践与进阶
java·数据库·sql
风语者日志19 小时前
[LitCTF 2023]这是什么?SQL !注一下 !
android·数据库·sql
lang2015092819 小时前
Spring Boot 核心技巧与实战指南
java·数据库·spring boot
呆呆小金人20 小时前
SQL视图:虚拟表的完整指南
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
笨手笨脚の21 小时前
Mysql 读书笔记
数据库·mysql·事务·索引·orderby·自增主键
码力引擎21 小时前
【零基础学MySQL】第四章:DDL详解
数据库·mysql·1024程序员节
程序新视界21 小时前
MySQL的隔离级别及其工作原理详解
数据库·后端·mysql
liliangcsdn21 小时前
如何基于llm+mysql构建轻量级全文搜索
数据库·人工智能·mysql
李慕婉学姐21 小时前
Springboot微信小程序在线考试系统w47h61gy(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·微信小程序