浅浅的聊聊MySQL的MVCC

readView:

有三个字段

creator_trx_id:记录当前事务的id

min_trx_id:记录未提交事务的id

max_trx_id:记录未开始的事务id

解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判断该访问哪个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。

如果是rc(read committed)隔离级别,每一次执行快照读时生成ReadView,根据当前事务ID去undolog中找已提交的事务(id<min_trx_id中的最小值),如果是rr(repeatable read)隔离级别仅在事务中第一次执行快照读时生成ReadView,后续复用。

MVCC本质:通过undolog实现多个版本,与readView进行CAS操作(乐观锁)获取对应的结果。

读未提交:不加锁,也没有MVCC,操作的是数据源

读已提交:使用MVCC,每一次查询都需要创建快照(readView)

可重复读:使用MVCC,只有第一次查询才会创建快照(readView)这样才会避免不可重复读

串行化:未使用MVCC,直接就是表锁,串行执行,性能最差,不到万不得已 不用。

相关推荐
沪漂阿龙15 小时前
MySQL 面试题爆款详解:InnoDB 页机制、B+树索引、Buffer Pool、Redo Log、页分裂与性能优化一次讲透
b树·mysql·性能优化
思麟呀16 小时前
MySQL的事物管理
数据库·mysql
weixin_4492900117 小时前
Docker + MySQL 在 Windows 11 上的本地安装部署文档
mysql·docker·容器
浪客灿心18 小时前
mysql表的操作和数据类型
mysql
YL2004042618 小时前
MySQL-进阶篇-锁
数据库·mysql
乐观的Terry19 小时前
博客系统全文搜索实战:用 Elasticsearch 告别 MySQL LIKE 查询
mysql·elasticsearch
米高梅狮子20 小时前
01.mysql的备份与恢复
运维·数据库·mysql·docker·容器·kubernetes·github
夕除20 小时前
spring boot 9
java·mysql·spring
老码观察21 小时前
MySQL 慢 SQL 治理实战:从索引原理到真实踩坑
sql·mysql
思麟呀21 小时前
MySQL的视图特性和用户权限管理
数据库·mysql