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

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

如有指正,十分感谢

相关推荐
进击的CJR2 分钟前
MySQL 8.0 OCP 英文题库解析(十)
mysql·adb·开闭原则
观测云25 分钟前
HikariCP 可观测性最佳实践
数据库
文牧之43 分钟前
PostgreSQL的扩展 dblink
运维·数据库·postgresql
趁你还年轻_1 小时前
Redis-旁路缓存策略详解
数据库·redis·缓存
在云上(oncloudai)2 小时前
AWS DocumentDB vs MongoDB:数据库的技术抉择
数据库·mongodb·aws
夕泠爱吃糖2 小时前
MySQL范式和反范式
数据库·mysql
Re2752 小时前
并发事务问题:现象、成因与解决方案
mysql
时序数据说4 小时前
时序数据库IoTDB与EdgeX Foundry集成适配服务介绍
大数据·数据库·开源·时序数据库·iotdb
用手手打人4 小时前
SpringBoot(七) --- Redis基础
数据库·redis·缓存
Despacito0o4 小时前
瀚文机械键盘固件开发详解:HWKeyboard.cpp文件解析与应用
数据库·mongodb·计算机外设