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 小时前
MySql存储引擎与索引
数据库·sql·mysql
lzhdim4 小时前
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题
数据库·sql
瀚高PG实验室4 小时前
瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题
数据库·瀚高数据库
TDengine (老段)4 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
敲个大西瓜4 小时前
Java项目常用数据归档方式
mysql
YOU OU5 小时前
Spring IoC&DI
java·数据库·spring
Muscleheng6 小时前
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
数据库·postgresql
kyriewen6 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
小码工作室7 小时前
使用 HAVING 进行 MySQL 集合筛选
mysql
罗超驿7 小时前
18.事务的隔离性和隔离级别:MySQL面试高频考点全解析
数据库·mysql·面试