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

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

如有指正,十分感谢

相关推荐
豆芽脚脚6 小时前
MongoDB 导出和导入完整指南
数据库·mongodb
烧饼Fighting6 小时前
Mysql替换为瀚高数据库部分函数转换V4.5版本
数据库·mysql
上善若水_厚德载物6 小时前
Centos7 Mysql 5.7 读写分离
数据库·mysql
Mr__Miss7 小时前
Redis的持久化
数据库·redis·缓存
CCPC不拿奖不改名7 小时前
SQL基础(SQL小白教程):MySQL语句+环境一键搭建+面试习题
数据库·sql·计算机网络·mysql·oracle·面试·职场和发展
陈文锦丫7 小时前
JAVA面试
数据库·mysql
sunfove7 小时前
将 Python 仿真工具部署并嵌入个人博客
开发语言·数据库·python
冰清-小魔鱼9 小时前
各类数据存储结构总结
开发语言·数据结构·数据库
深藏bIue9 小时前
MongoDB 4.4.30安装、数据迁移
数据库·mongodb
benyuanone9 小时前
MySQL环境项目迁移成国产化达梦环境
数据库·mysql