MySQL中的MVCC(多版本并发控制)

MySQL中的MVCC(多版本并发控制)

MySQL中的多版本并发控制(MVCC)是一种重要的机制,它允许多个事务并发地读取和修改数据库,同时保持数据的一致性和隔离性。MVCC通过维护数据的多个版本,使事务能够看到一致的数据库视图,从而避免了大多数锁定操作,提高了数据库的并发性能。

MVCC的工作原理

MVCC的核心概念是行的版本管理和事务ID(Transaction ID, TXID)。在MySQL的InnoDB存储引擎(更多请参考:MySQL 存储引擎详解)中,每个事务开始时都会分配一个唯一的事务ID,这个ID用于跟踪事务的状态以及行的版本信息。以下是MVCC的详细工作机制:

  1. 行的版本管理

    • 每个数据行在InnoDB存储引擎中都有两个隐藏的列:trx_idroll_pointer
      • trx_id表示最后一次修改该行的事务ID。
      • roll_pointer指向回滚日志中的旧版本数据,用于支持事务的回滚和一致性读取。
  2. 读取一致性视图

    • 当一个事务开始时,它会生成一个一致性视图(Consistent Read View),该视图包含当前活动事务的ID列表。
    • 在读取数据时,事务会根据一致性视图判断每行数据的可见性。具体规则如下:
      • 如果数据行的trx_id小于当前事务的ID,则该行是可见的(表示该行在当前事务开始之前已提交)。
      • 如果数据行的trx_id大于当前事务的ID,则该行不可见(表示该行在当前事务开始之后被修改)。
      • 如果数据行的trx_id在一致性视图的活动事务ID列表中,则该行不可见(表示该行由未提交的其他事务修改)。
  3. 写操作

    • 当事务对数据行进行修改时,会创建该行的新版本,新的trx_id设为当前事务的ID,并更新roll_pointer指向旧版本。
    • 旧版本的行数据会保留在回滚段中,直到不再需要(即没有其他事务在读取它)。
  4. 垃圾回收

    • InnoDB存储引擎会定期执行垃圾回收操作,清除不再需要的旧版本行数据,以释放存储空间。
    • 这个过程称为“清除(Purge)”,由后台线程自动处理。
    • 清除操作的步骤如下:
      • 扫描回滚段:InnoDB会扫描回滚段,查找已提交事务所留下的旧版本数据。
      • 判断可见性:如果没有任何活跃事务需要访问这些旧版本数据,它们就可以被删除。
      • 删除旧版本:删除旧版本数据,释放相关的存储空间。
      • 更新索引:更新所有相关的索引以反映删除操作。
      • 重复操作:这个过程是持续的,InnoDB后台线程会定期执行,以保持数据库的高效性。
代码示例

以下示例展示了MVCC在MySQL中的实际应用,包括插入、更新和读取操作。

-- 创建示例表,并添加注释
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID,自动递增,主键',name VARCHAR(50) COMMENT '用户名称',balance DECIMAL(10, 2) COMMENT '用户余额,保留两位小数'
) COMMENT='用户信息表';-- 插入一些数据
INSERT INTO users (name, balance) VALUES ('Alice', 100.00), ('Bob', 150.00), ('Charlie', 200.00);-- 事务1:读取数据
START TRANSACTION;
SELECT * FROM users;
-- 事务1读取users表的所有数据。此时会生成一个一致性视图,事务将看到事务开始时的数据库状态。
-- 假设事务1在此时暂停,继续执行其他操作-- 事务2:更新数据
START TRANSACTION;
UPDATE users SET balance = balance - 50 WHERE name = 'Alice';
-- 事务2更新Alice的余额,创建了一个新版本的行,并更新了trx_id和roll_pointer。
COMMIT;-- 事务3:读取数据
START TRANSACTION;
SELECT * FROM users;
-- 事务3读取users表的数据。由于事务2已提交,事务3将看到Alice的余额减少到50。
COMMIT;-- 事务1:再次读取数据
SELECT * FROM users;
-- 事务1再次读取users表的数据。由于事务1的读取视图是在事务2提交之前创建的,
-- 事务1仍然看到Alice的余额为100。
COMMIT;

通过以上示例可以看到,MVCC通过维护行的多个版本和一致性视图,确保了事务的隔离性和一致性,同时提高了数据库的并发性能。MySQL中的MVCC使得读取操作无需加锁,从而避免了大多数锁竞争和死锁问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode滑动窗口的使用

1.滑动窗口 文章目录 1.滑动窗口1.1 什么是滑动窗口?1.2 解题思路1.3 扩展 1.1 什么是滑动窗口? 滑动窗口是一种处理数组或序列数据时常用的数据结构和算法思想。在计算机科学中,它通常涉及在数组上设置一个可变的窗口,该窗口可以…

PCL-基于FPFH的SAC-IA结合ICP的点云配准方法

目录 一、相关方法原理1.凸包方法2.FPFH特征描述3.SAC-IA概述4.ICP概述 二、实验代码三、实验结果 一、相关方法原理 点云是在同一空间参考系下表达目标空间分布和目标表面特性的海量点集合,在获取物体表面每个采样点的空间坐标后,得到的是点的集合&…

【java技术】xxl-job的实现

Xxl-Job 是一个轻量级的分布式任务调度平台,它支持定时任务的创建、管理、执行和监控。Xxl-Job 的设计理念是简单易用、轻量级、高性能,适合于微服务架构下的任务调度场景。 Xxl-Job 的实现原理涉及到几个关键组件和技术细节。下面是 Xxl-Job 的核心组件…

构建智能运维系统:创新架构与效率优化

随着信息技术的迅猛发展,企业对于运维效率和服务质量的要求越来越高。智能运维系统的设计和实施,不仅能够提升系统可靠性和响应速度,还能有效降低成本和人力投入。本文将深入探讨智能运维系统的架构设计原则和关键技术,为企业在运…

数据结构重置版(概念篇)

本篇文章是对数据结构的重置,且只涉及概念 顺序表与链表的区别 不同点 顺序表 链表 存储空间上 物理上一定连续 逻辑上连续,但物理上不一定连续…

MYSQL(2) 高级查询

文章目录 概述高级查询基础查询条件查询范围查询判空查询模糊查询分页查询查询后排序分组查询 小结 概述 接上篇,上篇写到增删改查。这篇继续。 高级查询 基础查询 -- 全部查询 select * from student; -- 只查询部分字段 select sname, class_id from student;…

.env.local 配置本地环境变量 用于团队开发

.env.local 用途:.env.local 通常用于存储本地开发环境中的环境变量。这些变量可能包括敏感数据或特定于单个开发者的设置,不应该被提交到版本控制系统中。优先级:在大多数框架中,.env.local 文件中的变量会覆盖其他 .env 文件中…

Java唯一订单编号生成

在Java中生成唯一的订单编号通常需要结合时间戳、随机数和/或序列号等元素来确保唯一性。下面是一个简单的示例,使用当前时间的毫秒值加上一个随机数来生成订单号。为了简化,我们将使用​​java.util.UUID​​类来生成一个全局唯一的UUID,并将…

分类模型的完整流程及Python实现

1、加载函数和数据集 import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt cancer…

linux系统查历史cpu使用数据(使用sar 查询cpu和网络占用最近1个月历史数据)。

一 sar 指令介绍 在 Linux 系统中,sar 是 System Activity Reporter 的缩写,是一个用于收集、报告和保存系统活动信息的工具。它是 sysstat 软件包的一部分,提供了丰富的系统性能数据,包括 CPU、内存、网络、磁盘等使用情况&am…

Jdk有哪些版本

JDK(Java Development Kit)是Java编程语言的软件开发工具包,其版本随着Java语言的不断发展而更新。以下是JDK的一些主要版本及其相关信息: JDK 8(发布于2014年3月):引入了一系列新功能,如Lambda表达式、函数式接口、Stream API和新的日期/时间API等。是Java历史上一个…

SQL中的LEFT JOIN、RIGHT JOIN和INNER JOIN

在SQL中,JOIN操作是连接两个或多个数据库表,并根据两个表之间的共同列(通常是主键和外键)返回数据的重要方法。其中,LEFT JOIN(左连接)、RIGHT JOIN(右连接)和INNER JOIN…

《JavaEE篇》--多线程(2)

《JavaEE篇》--多线程(1) 线程安全 线程不安全 我们先来观察一个线程不安全的案例: public class Demo {private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {//让count自增5W次…

HarmonyOS网络请求的简单用法,HttpUtil简单封装

请求网络获取数据 点击按钮发送一个post请求,发送一条string由于此处的返回result.data本身就是一个string,因此不需要转换类型 Button(请求网络).margin({ top: 10 }).fontSize(24).fontWeight(FontWeight.Bold).onClick(() > {httpRequestPost(http…

JVM 内存结构、垃圾回收机制与并发容器

目录 一、JVM 内存结构 1. 程序计数器(Program Counter Register): 2. Java 虚拟机栈(JVM Stack): 3.本地方法栈(Native Method Stack): 4.堆(Heap&#xff…

Android笔试面试题AI答之控件Views(6)

答案来着文心一言,仅供参考 目录 1.简述什么是RemoteViews?使用场景有哪些?RemoteViews的特性使用场景总结 2.获取View宽高的几种方法?1. 在onWindowFocusChanged方法中获取2. 使用ViewTreeObserver.OnGlobalLayoutListener3. 使用ViewTreeObserver.OnPreDrawLi…

风格迁移开发记录(DCT-Net)

1.DCT-Net部署 阿里旗下的 modelscope社区,丰富的开源风格迁移算法模型 DCT-Net GitHub链接 git clone https://github.com/menyifang/DCT-Net.git cd DCT-Netpython run_sdk.py下载不同风格的模型如下图每个文件夹代表一种风格,有cartoon_bg.pb, car…

C++STL详解(一)——String接口详解(上)!!!

目录 一.string类介绍 二.string类的构造赋值 2.1string类的拷贝和构造函数 2.2深拷贝 三.string类的插入 3.1push_back 3.2append 3.3操作符 3.4insert 四.string的删除 4.1pop_back 4.2erase 五.string的查找 5.1find 5.2rfind 六.string的比较 6.1compare函…

独家|二十年国货羊奶粉老品牌发力成人奶粉,瞄准低GI、特医食品

前言 中国羊奶看陕西。 作为陕西省农业产业化重点企业以及陕西省专精特新企业,成立于2004年的羊奶粉品牌雅泰乳业正在不断进行深入布局。 雅泰乳业成人粉部门销售总监于维涛近日向AgeFood表示,雅泰成人奶粉业务主要分为两部分。一部分是以雅泰牧歌、龙…

深入浅出WebRTC—Pacer

平滑发包(Pacer)是 WebRTC 实现高质量实时通信不可或缺的一部分。在视频通信中,单帧视频可能包含大量的数据,如果未经控制地立即发送,可能瞬间对网络造成巨大压力。Pacer 能够根据网络条件动态调整发送速率&#xff0c…