MySQL中MVCC指什么?

简要回答:

MVCC(multi version concurrency control)即多版本并发控制,为了确保多线程下数据的安全,可以通过undo log和ReadView来实现不同的事务隔离级别。

对于已提交读和可重复读隔离级别的事务来说,MVCC是通过undo log和ReadView来实现的,区别在于创建Read View的时机不同。

已提交读:在每个select语句执行前生成Read View

可重复读:在第一个select语句执行前生成Read View

详细解释:

MVCC(multi version concurrency control)即多版本并发控制,为了确保多线程下数据的安全。

多线程下数据存在安全问题,如:脏读,不可重复读,幻读

脏读:有AB两个事务,B事务对一条数据进行修改,但未提交;而A事务在这之后对同一条数据进行读操作,读到的若是未提交的修改后的数据,就产生了脏读问题。

不可重复读:有AB两个事务,A在多次执行一条查询的SQL语句,在A执行的过程中B修改了某条数据,导致A多次读出来的结果不一样

幻读:有AB两个事务,A在多次执行一条查询的SQL语句,在A执行的过程中B插入了了某条数据,导致A多次读出来的结果不一样

为了避免上述问题,就有了MVCC,用MVCC可以使用undo log和ReadView来实现不同的事务隔离级别

undo log:回滚日志,存储了每行数据的多个版本

ReadView:判断当前事务可以读取哪个版本的依据

事务的隔离级别:

未提交读(RU)

已提交读(RC)

可重复读(RR)

序列化/串行化(Serializable)

|--------------------|-----|-------|-----|
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
| 未提交读(RU) | 存在 | 存在 | 存在 |
| 已提交读(RC) | 不存在 | 存在 | 存在 |
| 可重复读(RR) | 不存在 | 不存在 | 存在 |
| 可序列化(Serializable) | 不存在 | 不存在 | 不存在 |

对于已提交读和可重复读隔离级别的事务来说,MVCC是通过undo log和ReadView来实现的,区别在于创建Read View的时机不同。

已提交读:在每个select语句执行前生成Read View

可重复读:在第一个select语句执行前生成Read View

鉴于作者水平有限,文章可能存在错误

如有指正,十分感谢

相关推荐
专业软件系统开发2 小时前
药品说明书查询系统源码 本地数据库 PHP版本
数据库·查询系统源码·说明书查询源码
冉冰学姐5 小时前
SSM足球爱好者服务平台i387z(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架·足球爱好者服务平台
大飞记Python5 小时前
部门管理|“编辑部门”功能实现(Django5零基础Web平台)
前端·数据库·python·django
清风6666667 小时前
基于单片机的智能收银机模拟系统设计
数据库·单片机·毕业设计·nosql·课程设计
资深低代码开发平台专家7 小时前
PostgreSQL 18 发布
数据库·postgresql
与衫8 小时前
在 VS Code 里看清你的数据流向:Gudu SQL Omni 实测体验
数据库·sql
Element_南笙9 小时前
吴恩达新课程:Agentic AI(笔记2)
数据库·人工智能·笔记·python·深度学习·ui·自然语言处理
长安城没有风9 小时前
从入门到精通【Redis】Redis 典型应⽤ --- 分布式锁
数据库·redis·分布式
Ytadpole9 小时前
MySQL 数据库优化设计:优化原理和数据库表设计技巧
数据库·mysql·优化·索引·查询·检索·表设计