MYSQL的多版本并发控制MVCC(Multi-Version Concurrency Control)

这篇具有很好参考价值的文章主要介绍了MYSQL的多版本并发控制MVCC(Multi-Version Concurrency Control)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、概述

MVCC是一种用于数据库管理系统的并发控制技术,允许多个事务同时访问数据库,而不会导致读写冲突。也就是说在读写的时候,线程不用去争抢读写锁。因为加锁的过程比较耗性能。
当然很多时候还是必须的,不能避免,比如说,去ATM机取钱的时候,同时又在手机APP上进行提现,这种操作就需要加锁,不能让其同时提现,一次只能一个操作,而且只有在ATM取钱这个事务被提交之后才能做其他操作。

处理并发的场景无外乎三种:

读、读:这个不需要做控制,因为数据没有变化
读、写:存在线程安全问题,可能出现脏读、幻读,不可重复读
写、写:存在线程安全问题,可能出现更新丢失的情况

这里介绍的MVCC是在存储引擎为InnoDB实现的,目的也是为了提高数据库的并发性能,不使用加锁的方式去处理读、写并发。

2、MVCC特点

这里的读操作,有两种方式:
快照读:SELECT语句,在读写的时候不用加锁,所以效率很高,但也存在读取的时候有更新操作,可能会读到历史数据。

当前读:读取的是最新数据,是一种悲观锁的操作。它会对当前读取的数据进行加锁,避免其他事物对其进行写操作。主要包括以下几种操作:

select lock in share mode(共享锁)
select for update(排他锁)
update(排他锁)
insert(排他锁)
delete(排他锁)

3、准备数据

在介绍之前,没有安装MYSQL的,可以先进行安装,下载地址:https://dev.mysql.com/downloads/
安装好了之后,我们就新建库与表,插入一些数据来做个测试

CREATE DATABASE mydb;
USE mydb;

CREATE TABLE `tb1` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

INSERT INTO tb1(name) VALUES ('XIAO1'),('XIAO2'),('XIAO3');

CREATE TABLE `tb2` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=myisam;

INSERT INTO tb2(name) VALUES ('LAO1'),('LAO2'),('LAO3');

这里我特地创建了两张表,分别是表tb1对应的是InnoDB引擎,表tb2对应的是myisam引擎,创建之后,也可以看到两者的数据格式也是不一样的,我们先查询下,新建的数据库mydb以及保存的数据在什么地方:

mysql> show variables like '%datadir%';
+---------------+---------------------------------------------+
| Variable_name | Value                                       |
+---------------+---------------------------------------------+
| datadir       | C:\ProgramData\MySQL\MySQL Server 8.0\Data\ |
+---------------+---------------------------------------------+
1 row in set, 1 warning (0.00 sec)

然后可以看到,InnoDB引擎对应的是:tb1.ibd myisam对应的是:tb2.MYD(数据)、tb2.MYI(索引)、tb2_402.sdi(表结构)[这个在以前的版本没有出现]
MySQL5.5之后都是默认为InnoDB引擎

4、MVCC原理

MYSQL存储的数据中,除了我们显式定义的字段,还隐含着两个字段。
trx_id:事务id,每进行一次事务操作,就会自增1。
roll_pointer:回滚指针,用于找到上一个版本的数据,结合undolog进行回滚。

MYSQL的多版本并发控制MVCC(Multi-Version Concurrency Control),其他(Others),mysql,MVCC,MYSQL多版本并发控制
我们用SELECT读数据时,这一时刻的数据会有很多个版本【比如上图四个版本】,但我们并不知道读取哪个版本,依赖ReadView来对我们进行版本的选择,通过ReadView我们就能够知道读取哪个版本。我们来看下这个ReadView的定义:

class ReadView {
/* ... */
private:
trx_id_t m_low_limit_id; /* 大于等于这个 ID 的事务均不可见 */

trx_id_t m_up_limit_id; /* 小于这个 ID 的事务均可见 */

trx_id_t m_creator_trx_id; /* 创建该 Read View 的事务ID */

trx_id_t m_low_limit_no; /* 事务 Number, 小于该 Number 的 Undo Logs 均可以被 Purge */

ids_t m_ids; /* 创建 Read View 时的活跃事务列表 */

m_closed; /* 标记 Read View 是否 close */
}

字段的解释:

m_low_limit_id:目前出现的最大事务ID+1(下一个将被分配的事务ID)。大于等于这个ID的数据版本均不可见,也就访问不到。

m_up_limit_id:活跃事务列表m_ids中最小的事务ID,如果为空,则m_up_limit_id为m_low_limit_id。小于这个ID的数据版本均可见。

m_ids:ReadView创建时其他未提交的活跃事务ID列表。创建ReadView时,将当前未提交事务ID记录下来,后续即使它们修改了记录行的值,对于当前事务也是不可见的。m_ids 不包括当前事务自己和已提交的事务(正在内存中)

m_creator_trx_id:创建该ReadView的事务ID

5、实践操作

开四个终端,新建三个事务,两个写操作,一个读操作,还有一个就是单纯的查询。大家可以根据不同的进入时间来了解这个过程,会产生未提交和已提交事务状态,对应的查询信息都是不一样的,具体代码分别如下:

BEGIN;
UPDATE tb1 SET  name='XXX' WHERE id=1;
UPDATE tb1 SET  name='YYY' WHERE id=1;
COMMIT;

BEGIN;
UPDATE tb1 SET  name='ZZZ' WHERE id=1;
UPDATE tb1 SET  name='QQQ' WHERE id=1;
DELETE FROM tb1 WHERE id=5;
COMMIT;

BEGIN;
SELECT * FROM tb1 WHERE id=1;
COMMIT;

SELECT * FROM tb1;

6、小结

对于这种读写并发,以及对性能的要求,大家需要看实际业务情况来做决定,其中这里主要是介绍InnoDB引擎,这个要高效很多,在以前的旧版本可能大家使用MyISAM这个更多,因为性能很好,不过不支持事务操作,所以很多场景也就不适应,MYSQL5.5版本之后就是默认InnoDB引擎了。
最后大家也可以尝试在表tb2中去尝试下,看下是什么结果,因为这张表使用的是MyISAM引擎,就起不到作用了。
另外需要注意的是,事务的提交是默认自动的,有些时候需要关闭,将默认的1修改为0:

SET AUTOCOMMIT=0;
SELECT @@AUTOCOMMIT;

比如说对于脏读的情况,我们需要当前读,也就是需要排它锁:

SET AUTOCOMMIT=0;
BEIGIN;
DELETE FROM tb1 WHERE id=2;

这种情况如果我们的事务在这个时候进去,对这个id=2进行读写操作,就会出现脏读的情况,这个时候就需要使用SELECT FOR UPDATE,等待事务处理完毕之后再做相应的操作。

对于脏读这种情况,很常见,比如说事务在做删除操作,这个时候记录已被删除但是还没有提交事务,如果进行查询操作就会出现脏读,如下:

MYSQL的多版本并发控制MVCC(Multi-Version Concurrency Control),其他(Others),mysql,MVCC,MYSQL多版本并发控制文章来源地址https://www.toymoban.com/news/detail-727255.html

SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM tb1 WHERE id=2 FOR UPDATE;
UPDATE tb1 SET  name='QQQ' WHERE id=1;
COMMIT;

到了这里,关于MYSQL的多版本并发控制MVCC(Multi-Version Concurrency Control)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 多版本并发控制 MVCC

    事务的4个隔离级别以及对应的三种异常 读未提交( Read uncommitted ) 读已提交( Read committed ):脏读 可重复读( Repeatable read ):不可重复读 串行化( Serializable ):幻读 脏读:一个事务读取到了另外一个事务没有提交的数据; 不可重复读:在同一个事务中,两次读取同一

    2024年01月18日
    浏览(48)
  • 【MySQL】事务之MVCC(多版本并发控制)

    读-读 :不存在任何问题,也不需要并发控制 读-写 :有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读 写-写 :有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失 多版本并发控制 ( MVCC )是一种用来解决 读

    2024年02月14日
    浏览(46)
  • MySQL多版本并发控制mvcc原理浅析

    1.mvcc简介 1.1mvcc定义 mvcc(Multi Version Concurrency Control),多版本并发控制,是一种数据库的并发控制机制。它用于管理事务并发执行时对数据的访问和修改,保证在多个事务同时对数据库进行读写操作,不会出现数据不一致或丢失的情况 1.2mvcc解决的问题 当多个事务同时访问数据

    2024年04月25日
    浏览(35)
  • 【MySQL高级篇笔记-多版本并发控制MVCC(下) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一、什么是MVCC 二、快照读与当前读 1、快照读  2、当前读 三、复习 1、再谈隔离级别 2、隐藏字段、Undo Log版本链 四、MVCC实现原理之ReadView  1、什么是ReadView  2、设计思路 3、ReadView的规则 4、MVCC整体操作流程 五、举例说明 1、READ

    2024年02月08日
    浏览(60)
  • ⑩⑧【MySQL】InnoDB架构、事务原理、MVCC多版本并发控制

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ InnoDB逻辑存储结构 : 🚀 表空间(idb文件) :一个MySQL实例可以对应多个表空间,用于存储记录、索引等数

    2024年02月04日
    浏览(44)
  • 一文了解MySQL中的多版本并发控制

    作者:京东零售  李泽阳 最近在阅读《认知觉醒》这本书,里面有句话非常打动我: 通过自己的语言,用最简单的话把一件事情讲清楚,最好让外行人也能听懂。 也许这就是大道至简,只是我们习惯了烦琐和复杂。 希望借助今天这篇文章,能用大白话说清楚这个相对比较

    2023年04月11日
    浏览(44)
  • 多版本并发控制MVCC

    MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的 并发控制 。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更

    2024年02月08日
    浏览(40)
  • MVCC并发版本控制之重点ReadView

    本文大部分来自 《MySQL是怎样运行的》,这里只是简单总结,用于各位回忆和复习。 对于使用 InnoDB 存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(不知道的快去看《MySQL是怎样运行的》) trx_id :每次一个事务对某条聚簇索引记录进行改动时,都会把该事

    2024年02月09日
    浏览(36)
  • MVCC:多版本并发控制案例分析(二)

    (笔记总结自b站马士兵教育课程) 本文主要分析readview的案例。 readview:表示事务进行快照读操作的时候产生的读视图,在该事务进行快照读的那一刻会生成一个系统当前的快照,但是此时的快照不是数据的快照,而是事务相关信息的快照。 trx_list readview生成时刻当前系统活

    2024年02月08日
    浏览(39)
  • MVCC------Mysql并发事务控制的工具

    MVCC 是 Multi-Version Concurrency Control(多版本并发控制)的缩写,是数据库系统中常用的一种并发控制方法。在MVCC 中,数据库系统可以同时维护多个版本的数据,每个事务在读取数据时会看到一个一致性的快照,从而实现并发访问而不会出现数据不一致的情况。这种机制能够提

    2024年03月14日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包