首页 > 数据库 >MVCC(解决MySql中的并发事务的隔离性)

MVCC(解决MySql中的并发事务的隔离性)

时间:2024-04-07 09:59:07浏览次数:22  
标签:事务 RR trx MVCC 视图 修改 并发 MySql id

 MVCC


如何保证事务的隔离性?

1.排他锁:如一个事务获取了一个数据行的排他锁,其他事务就不能再获取改行的其他锁。

2.MVCC:多版本并发控制。

58c8c1d5224e4dc39460b7d8acbdd2b5.png

MVCC:

30c39da925854364b6c6a7110ce0493f.png

1.隐藏字段

d1562e911d084c8487736cc3614411ff.png

1.DB_TRX_ID:最近修改事务的id。默认值从0开始,每次被修改自增1。也就是说每有一个事务修改了当前数据,这条数据的该字段就会自增1。(从而实现记录最近''修改事务''的id)

2.DB_ROLL_PTR:回滚指针。举个例子:对于这里id为1的数据,进行了三次修改。DB_TRX_ID就是3。但是,.DB_ROLL_PTR记录的是该行数据第一次修改时的版本。也就是第一次修改的事务id -> 1。这样后面配合undo log就知道回滚到上一个版本(就是三次修改前的版本)。

3.DB_ROW_ID:隐藏主键。当前表指定了主键,该字段就没啥意义了。

2.undo log

37d03c9e515c437d9c4a19f4f4d999c1.png

undo log版本链

32139e37ffb347e6a8b5284f9868fe92.png

这里每有一个事务修改当前行数据,就像链表中的尾插法一样,插入一个节点。

3.readView

a4f50feb25ee406ca1e3912c882ad0ff.png

RC (读提交):

        在RC隔离级别下,事务在执行每次读取操作时都会生成一个新的读视图(Read View)。这意味着每个读取操作都会基于当前活跃的事务ID(即未提交的事务)来构建一个一致性视图。因此,在RC隔离级别下,事务可能看到其他事务提交的更新,但这些更新必须是当前事务开始读取操作时已经存在的。换句话说,RC隔离级别允许不可重复读,即在一个事务中多次读取相同的记录可能会得到不同的结果,因为它可能看到了其他事务提交的更新。

RR (可重复读):

        相比之下,在RR隔离级别下,事务在启动时会创建一个读视图,并在整个事务的生命周期内保持不变。这意味着一旦事务开始,它将看到所有已经提交的记录的稳定视图,直到事务结束。在RR隔离级别下,即使其他事务在当前事务执行期间提交了更新,当前事务也不会看到这些变化,因为它已经有了一个稳定的数据快照。因此,RR隔离级别提供了可重复读的保证,即在一个事务中多次读取相同的记录将会得到相同的结果。

06e392b2e69144e192439beb39564d92.png

举个例子:现在是事务5执行第一条查询sql。

m_ids (当前活跃的事务):3、4、5(事务2已提交)

min_trx_id:3 (3、4、5中最小的id)

max_trx_id:6 (5+1)

creator_trx_id:5 (当前事务5做了查询,ReadView由事务5创建)

版本链数据访问规则:

0f8f198e887a42629821b9529f9e40b0.png

RC级别下的访问:

3c18e6d4e87f45a0a1dcc1142dd1ae78.png

在这个例子中:根据版本链数据访问规则事务5第一个sql对应的查询结构是事务2修改后的数据。原因:根据版本链从最新事务4开始比较。

此时:creator_trx_id = 5;min_trx_id = 3;max_trx_id = 6

4所有条件都不满足,事务3也都不满足。只有事务2满足:trx_id (2) < min_trx_id(3)。

同理,对于事务5第二条查询,也能得到结果。第二条sql查询的是事务3修改后的数据。

RR级别下的访问:

dc62ddd27faf44489a488093ca4f000d.png

由于RR多次查询,都只生成最初的一个视图。因此我们只需要搞明白第一个视图的查询结果。同上方法可知,这里也是查询到事务2修改后的数据。

总结:

1077a64480b64acc9430506402922349.png

标签:事务,RR,trx,MVCC,视图,修改,并发,MySql,id
From: https://blog.csdn.net/qq_64064246/article/details/137453128

相关文章

  • CentOS7安装MySQL8.0教程
    环境介绍操作系统:Centos7.6MySQL版本:8.0.27只要是8.0.*版本,那就可以按照本文说明安装一、安装前准备1、卸载MariaDB安装MySQL的话会和MariaDB的文件冲突,所以需要先卸载掉MariaDB。1.1、查看是否安装mariadbrpm-qa|grepmariadb1.2、卸载rpm-e--nodeps文件......
  • 【JavaWeb】Day32.MySQL概述——数据库设计-DDL(一)
    项目开发流程需求文档:    在我们开发一个项目或者项目当中的某个模块之前,会先会拿到产品经理给我们提供的页面原型及需求文档。设计:    拿到产品原型和需求文档之后,我们首先要做的不是编码,而是要先进行项目的设计,其中就包括概要设计、详细设计、接口设计、......
  • 基于keepalived+gtid+双vip半同步主从复制的MySQL高性能集群
    项目名称:基于keepalived+gtid+双vip半同步主从复制的MySQL高性能集群 目录项目名称:基于keepalived+gtid+双vip半同步主从复制的MySQL高性能集群 项目规划图1.配置4台MySQL服务器(1台master,2台slave,1台backup),安装好MySQL软件,安装好半同步相关的插件2.配置好ansible服务器,......
  • MySQL中的索引
    InnoDB存储引擎支持以下几种常见的索引:B+树索引、全文索引、哈希索引,其中比较关键的是B+树索引1.2.1.B+树索引InnoDB中的索引自然也是按照B+树来组织的,前面我们说过B+树的叶子节点用来放数据的,但是放什么数据呢?索引自然是要放的,因为B+树的作用本来就是就是为了快速检索数据而提......
  • MySQL中的sql优化
    一、SQL优化原则1、减少数据量(表中数据太多可以分表,例如超过500万数据 双11一个小时一张订单表)2、减少数据访问量(将全表扫描可以调整为基于索引去查询)3、减少数据计算操作(将数据库中的计算拿到程序内存中计算)二、SQL优化的基本逻辑1、良好的SQL编码习惯(熟悉SQL编码规范......
  • mysql数据库连接:返回list和dict格式
    importpymysqlfromapi.conf.settingimportmysql_infoclassHandleDb:def__init__(self):#连接数据库self.conn=pymysql.connect(host=mysql_info["host"],#mysql服务器ip或者域名user=mysql_info[&qu......
  • MySQL多表联合查询实例
    DDL——学生表,课程表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`......
  • MySQL中的逻辑运算符,位运算符
    转自:https://blog.csdn.net/Sihang_Xie/article/details/125480206一、 逻辑运算符MySQL中支持4种逻辑运算符:运算符作用NOT或!逻辑非AND或&&逻辑与OR或||逻辑或XOR逻辑异或以上4种逻辑运算符都非常简单,如果有其他编程语言的基础,看一下以下的例......
  • 【包远程安装运行】SpringBoot+Mysql实现的在线兼职实习招聘管理系统源码+运行教程+开
    今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的在线招聘系统,主要实现了在线招聘基本操作流程的全部功能,系统分普通用户、管理员等角色,除基础脚手架外,实现的功能有:管理员:系统管理、职位管理、新闻咨询管理、简历投递管理、在线统计等。普通用户(......
  • 【包远程安装运行】:SpringBoot+Mysql健身房在线预约管理系统源码+运行视频+开发文档(参
    今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的健身房在线预约管理系统,系统分四个角色,管理员,职工、教练、前台用户,各角色功能如下:管理员:系统管理(角色、权限、菜单等)、职工管理、健身会员管理、会员充值管理、健身项目管理、健身百科管理、健身......