MySQL的MVCC

什么是MVCC:

MVCC是多版本并发控制器,是通过记录历史半本书,解决读写并发冲突问题,避免了读数据时加锁,提高了事务的并发性能。

讲历史数据存储在undo log中,结构逻辑上类似于一个链表,MySQL数据行上的两个隐藏列,一个是事务ID,一个是指向undo log的指针

事务开启后,执行第一条select语句的时候,会创建ReadView,ReadView记录了当前未提交的事务。通过与历史数据的事务ID进行比较,就可以根据可见性规则进行判断,判断这条记录是否可见,如果可见就直接将这条数据返回个客户端,如果不可见就继续王undo log版本链查找第一个可见的数据。

我们每一条记录都有两个隐藏列,一个是事务ID,一个是指向历史数据undo log的指针,然后ReadView有四个字段,分别是创建ReadView的事务ID,活跃事务ID列表,活跃事务ID列表中的最小ID,下一个事务ID。主要有这几种判断规则:

  • 如果记录事务的ID小于活跃事务ID列表中的最小ID,就说明记录在创建ReadView前就生成好了,所以该记录当前事务是可见的。
  • 如果记录事务的ID大于等于下一个事务的ID,就说明该记录是在创建ReadView后才生成的, 所有该记录是当前事务不可见的。
  • 如果记录隐藏列的事务ID在最小的ID和下个事务的ID之间,这时候就需要看记录的事务ID是否在活跃事务的ID列表中
    • 如果记录的事务ID在活跃事务的ID列表中,说明修改该记录的事务还没提交,所以该记录是不可见的
    • 如果记录的事务ID不在活跃事务ID的列表中,说明修改记录的事务已经提交了,那么该记录就是可见的。
相关推荐
jjjxxxhhh1231 天前
[Google Test]- Google Test Ubuntu 完整验证指南
linux·数据库·ubuntu
三无少女指南1 天前
开发者环境配置:用 Ollama 实现本地大模型部署(附下载慢的解决方案
c语言·开发语言·数据库·ubuntu
Lxinccode1 天前
AI编程(3) / claude code[3] : 更新apiKey
java·数据库·ai编程·claude code
数据知道1 天前
MongoDB数据类型全景:String、Number、Date、Boolean 及特殊的 null 类型处理
数据库·mongodb
醉颜凉1 天前
PostgreSQL 模式(SCHEMA)详解:数据库对象的命名空间管理
数据库·postgresql
AI题库1 天前
PostgreSQL 18 默认密码修改全指南:从安装到安全加固
数据库·安全·postgresql
七夜zippoe1 天前
告别SQL恐惧症:我用飞算JavaAI的SQL Chat,把数据库变成了“聊天室”
java·数据库·sql·ai·javaai
半桔1 天前
【MySQL数据库】SQL 查询封神之路:步步拆解核心操作,手把手帮你解锁高阶玩法
linux·数据库·sql·mysql·adb·oracle
猫头虎1 天前
[精选] 2025最新MySQL和PostgreSQL区别、迁移、安全、适用场景全解析
运维·数据库·mysql·安全·postgresql·云原生·容器
No8g攻城狮1 天前
【SQL】MySQL中空值处理COALESCE函数
数据库·sql·mysql·postgresql·sqlserver