当前位置: 首页 > article >正文

mysql mvcc介绍

一、什么是mvcc

MVCC,即Multi-Version Concurrency Control (多版本并发控制)。它是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

二、什么时候会出现并发问题

  • 读-读;(不会),不需任何操作,不会出现并发问题
  • 读-写;(会),mvcc就是为了解决读写的并发事务问题,不加锁,快照读,效率快。
  • 写-写;(会),mvcc无能为力,所有涉及写写的操作都是通过加锁实现。

三、mvcc解决了什么问题

mvc解决了并发’读-写’下的数据不一致问题。针对的是mysql中读已提交和可重复读的隔离级别。

四、mvcc前置知识点

  1. 事务版本号
    事务每次开启前,都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序。
  2. 两个行记录字段
    trx_id:记录操作这条记录的事务id
    roll_pointer:指向回滚段的undolog
  3. undolog
    undolog,回滚日志,记录的是操作的反向操作,例如:每有一条insert语句会生成一条对应的delete语句。
    undolog两个作用:
    事务回滚时,保证事务一致性和原子性;
    mvcc快照读。
  4. 版本链
    多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针(roll_pointer),连成一个链表,这个链表就称为版本链。
  5. 快照读和当前读
    快照读:指的是读取的是快照,并不一定是数据库实际数据。所有的普通select读都是快照读。
    当前读:读取的数据库实际数据,也就是最新版本数据。显示加锁读的才是当前读
     select * from order where id > 10 for update;
     select & from order where id > 10 lock in share mode;
    
  6. Read View
    6.1 Read View 就是我们前面说的快照。在事务里面,出现普通select语句时,就会生成对应的Read View读快照。不通的隔离级别生成的时机不一样:
    • 读已提交(RC):每次select语句出现时都生成一个Read View;
    • 可重复读(RR):第一次select语句出现时才生成一个Read View,后续select语句并不会生成新的Read View。
      6.2 Read View里面的字段
    • m_ids:当前系统中那些活跃(未提交)的读写事务ID, 它数据结构为一个List。
    • min_limit_id:表示在生成ReadView时,当前系统中活跃的读写事务中最小的事务id,即m_ids中的最小值。
    • max_limit_id:表示生成ReadView时,系统中应该分配给下一个事务的id值。
    • creator_trx_id: 创建当前read view的事务ID

五、mvcc实现原理


http://www.kler.cn/news/136027.html

相关文章:

  • 【算法】二分查找-20231121
  • .NET 8.0 AOT 教程 和使用 和 .NET ORM 操作
  • Oracle 11g 多数据库环境下的TDE设置
  • 使用键盘管理器更改键盘快捷键,让键盘真正迎合你的使用习惯
  • 【NGINX--2】高性能负载均衡
  • Django(九、choices参数的使用、多对多表的三种创建方式、Ajax技术)
  • 前端本地存储数据库IndexedDB
  • 计算机是如何工作的(简单介绍)
  • 机器学习二元分类 二元交叉熵 二元分类例子
  • 分布式与微服务 —— 初始
  • 二进制部署k8s集群-过程中的问题总结(接上篇的部署)
  • 简单工程模式
  • 目标检测YOLO实战应用案例100讲-基于改进YOLOv5s的道路目标检测
  • Debian系列的Linux发行版上部署wvp
  • C语言--每日五道选择题--Day20
  • el-table 对循环产生的空白列赋默认值
  • 论文笔记:The Impact of AI on Developer Productivity:Evidence from GitHub Copilot
  • 怎么在echarts图上左右滑动切换数据区间
  • Flutter在web项目中使用iframe
  • html主页框架,前端首页通用架构,layui主页架构框架,首页框架模板
  • 设计原则 | 开放封闭原则
  • LeetCode【92】翻转链表II
  • 将Excel中的数据导入shell脚本
  • 用java编写图书管理系统
  • HDCTF2023 - Reverse方向全WP
  • 在Oracle 11g 数据库上设置透明数据加密(TDE)
  • 【SpringCloud】Eureka基于Ribbon负载均衡的调用链路流程分析
  • BLIP-2:冻结现有视觉模型和大语言模型的预训练模型
  • C#具名参数(Named Parameters)
  • Ubuntu下发送邮件