InnoDB 的隔离级别是如何实现的

news2024/11/14 17:17:51

点击上方“追梦 Java”关注,一起追梦!

169f2ba2db568ea8cee9a1143b115946.png

MySQL 数据库 InnoDB 存储引擎的隔离级别是通过锁和 MVCC 的机制实现的。

1

了解 MySQL 中锁的机制

fa4627dedcbcfcfa2dce88f021f706ec.png

锁是用于避免不同事务对共享资源的并发访问的产生读一致性的问题的机制。

1、表锁和行锁

InnoDB 存储引擎支持行锁和表锁,行锁就是锁住表里面的一行数据,用共享(S)锁和排他(X)锁来实现行锁;表锁就是锁住一张表,意向锁是表级锁,InnoDB 的表锁是通过行锁实现的,就是把表里所有的行用共享(S)锁和排他(X)锁来锁住。

2、表锁和行锁的性能分析

因为表锁只需要直接锁住这张表就行了,而行锁还需要在表里面去检索这一行数据,所以表锁的加锁效率更高。

因为当我们锁住一张表的时候,其他任何一个事务都不能操作这张表,但是我们锁住了表里面的一行数据的时候,其他的事务还可以来操作表里面的其他没有被锁定的行,所以表锁的冲突概率更大,那么表锁的并发性能就更低。

2

锁的分类

900426c4c442136951902914f793fbe0.png

1、共享锁(Shared Locks)

共享锁,又称为读锁,简称 S 锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

加锁方式: 

select * from person where id = 1001 LOCK IN SHARE MODE;

释放锁方式:

commit/rollback;

2、排他锁(Exclusive Locks)

排他锁,又称为写锁,简称 X 锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的锁(包括共享锁和排他锁),只有这个获取了排他锁的事务才可以对数据行进行修改,其它的事务不能对这个数据行进行修改,但是可以进行读取(通过 MVCC 的快照来读取的)。

加锁方式:

自动:delete 、update、insert 默认加上 X 锁;

手动:

select * from person where id = 1001 FOR UPDATE;

释放锁方式:

commit/rollback;

共享锁和排他锁都是行锁,InnoDB 的行锁,就是通过锁住索引来实现的,只有通过索引进行数据检索,InnoDB 才会使用行锁,否则 InnoDB 将使用表锁,锁住所有的记录。这也就是为什么我们在做数据删除的时候一定要让 sql 命中索引,否则就会锁表。

3、意向锁(Intention Locks)

意向锁是由 InnoDB  数据引擎自己维护的,用户无法手动操作意向锁。

当我们给一行数据加上共享锁之前,数据引擎就会自动在这张表上面加一个意向共享锁(Intention Shared Lock,简称 IS 锁)。

当我们给一行数据加上排他锁之前,数据引擎就会自动在这张表上面加一个意向排他锁(Intention Exclusive Lock,简称 IX 锁)。

如果一张表上面至少有一个意向共享锁,说明有其他的事务给其中的某些数据行加上了共享锁。

如果一张表上面至少有一个意向排他锁,说明有其他的事务给其中的某些数据行加上了排他锁。

IS 锁 和  IX 锁是两个表锁,它们的作用是用来提高加锁的效率的,如果没有意向锁的话,当我们准备给一张表加上表锁的时候,就得先要去判断有没其他的事务锁定了其中了某些行,如果有的话,肯定不能加上表锁。那么这个时候我们就要去扫描整张表才能确定能不能成功加上一个表锁,如果数据量特别大,比如有上千万的数据的时候,加表锁的效率就会很低。但是我们引入了意向锁之后,我们只要判断这张表上面有没有意向锁就可以了,如果有就直接返回失败,如果没有就可以加锁成功。

所以 InnoDB 里面的表锁,我们可以把它理解成一个标志,当我们给一行数据加上行锁的时候,系统自动帮我们加上意向锁,作为一个标志,用来提高加表锁的时候(如果没有用到索引就会加表锁)的执行效率。

4、自增锁(AUTO-INC Locks)

自增锁是针对自增列自增长的一个特殊的表锁,这是为主键自增专门实现的锁。可以通过以下命令查看自增是否连续,默认为 1,表示连续。

show variables like 'innodb_autoinc_lock_mode;

5、记录锁(Record Locks)

记录锁,就是锁定一条记录,当我们对于唯一性的索引(包括唯一索引和主键索引)使用等值查询,精准匹配到一条记录的时候,这个时候使用的就是记录锁。我们使用不同的主键去加锁,它只锁住这个主键的记录,所以叫记录锁。

6、间隙锁(Gap Locks)

间隙锁,就是锁定一段范围,当我们查询的记录不存在,没有命中任何一条记录,无论是用等值查询还是范围查询的时候,它使用的都是间隙锁,采用左开又开的区间。Gap Lock 只在 RR 隔离级别中存在。

7、临键锁(Next-key Lock)

临键锁,锁定范围加记录,当查询命中索引的时候,当通过范围查询的时候,数据引擎会按照按照范围划分区间,采用左开右闭的区间锁住它自己的区间以及它之后的一个区间,InnoDB 选择临键锁(Next-key Lock)作为行锁的默认算法,这么做的目的就是为了防止幻读。

3

MySQL 中四个事务隔离级别的实现

0e55ef34332f7b07904624e81307d466.png

RU隔离级别(Read Uncommited ):不加锁。

串行化隔离级别(Serializable):所有的 select 语句都会被隐式的转化为 select ... in share mode,会和 update、delete 操作互斥。

RR隔离级别(Repeatable Read):普通的 select 使用快照读(snapshotread),底层使用 MVCC 来实现;加锁的 select(select ... in share mode / select ... for update)以及更新操作 update、delete 等语句使用当前读(current read),底层使用记录锁、或者间隙锁、临键锁来实现。

RC隔离级别(Read Commited):普通的 select 都是快照读,使用 MVCC 实现,加锁的 select 都使用记录锁,因为没有间隙锁(Gap Locks)。

要解决读一致性的问题,保证一个事务中前后两次读取数据结果一致,我们可以采用加锁的方式来实现事务隔离,表示一个事务在读取的时候不允许其他事务修改,而一般的应用都是读多写少,因此加锁的方式会给数据库的效率带来问题,因此普通的 select 查询没有使用加锁的方式来保证事务隔离。

后面将为大家介绍 MySQL 中 MVCC 的原理。

有用的话点个在c213a04a0eded29a5838404fa7b1ae48.png

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

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

相关文章

如何与 Zappos 建立 EDI 连接?

Zappos 是一家享誉全球的知名在线鞋类和服饰零售商,经营范围涵盖各类时尚品牌的鞋类、服饰及配饰等,使命是为广大消费者提供方便、愉悦、优质的购物体验,让每一位顾客都能找到心仪的产品。多年来,Zappos 卖场凭借卓越的服务与产品…

通用VS垂直,讯飞星火与网易子曰不同的“大模型解法”

配图来自Canva可画 随着大模型商业化应用的提速,全世界各国都开始孵化和孕育各自的行业大模型。在此背景下,国内各个细分行业的垂直大模型,日益受到产业界的关注和重视。 相比通用大模型,垂直大模型具有门槛较低、数据质量较好且…

安装虚拟机

分区 根分区5个G 同理 交换分区 最后一个分区,默认所有

串口环形缓冲区

文章目录 一、串口环形缓冲区概念二、STC12例程(1)环形串口缓冲区结构体(2)串口环形缓冲区存和取数据(3)完整工程demo 一、串口环形缓冲区概念 串口环形缓冲区应用于嵌入式、物联网开发中处理接收串口数据…

windows C++多线程同步<3>-互斥量

windows C多线程同步<3>-互斥量 概念,如下图: 另外就是互斥对象谁拥有,谁释放 那么一个线程允许多次获取互斥对象吗? 答案是允许,但是申请多次就要释放多次,否则其他线程获取不到互…

在线进销存-亿发移动进销存管理系统,助力批发零售企业线上线下同步经营

随着移动互联网的蓬勃发展,商品进销存管理日益变得复杂而关键,数字化转型已经成为批发零售企业增强竞争力的有效工具。移动进销存管理系统为批发零售企业提供一体化 解决方案,实现线上线下同步经营,帮助企业实现对商品的有效管理&…

TDengine Cloud 加入 AWS 合作伙伴网络,助力出海企业数字化转型

近日,全托管的时序数据云平台 TDengine Cloud 正式入驻 AWS Marketplace(海外区),用户可通过 AWS Marketplace 轻松实现 TDengine Cloud 的订阅与部署,以最低的成本搭建最高效的数据处理架构。此外,早在 20…

python新手如何系统学习,走过这4个阶段成为高手

目录 python初级阶段学习 python中级阶段学习 python高级阶段学习 python进阶阶段学习 Python是一种简洁而强大的编程语言,广泛应用于软件开发、数据科学、人工智能等领域。很多新手如何系统学习python,今天我们从4个阶段来学习,就能成为高…

SpringBoot实现的旅游酒店管理系统源码附带视频运行教程

基于SpringBootMybatissThymeleaf框架系统主要有以下功能:分为前后台 前台用来展示数据,预定酒店、预定旅游、预定车票、购买保险等 后台:旅游路线管理、景点管理、酒店管理、车票管理、保险管理、攻略管理、留言管理、订单管理等后台管理员 …

关注这些问题,助你找到理想工作

导语:在寻找理想工作的过程中,有一些关键问题需要我们特别关注。了解并回答这些问题将有助于我们更好地定位自己,并找到符合自身需求和目标的职位。本文将介绍一些在找工作时需要关注的重要问题。 个人定位:首先,我们…

失去SSL证书,会对网站安全造成什么影响?

作为网络世界中的“身份证”,SSL证书可以在网络世界中证明你是一个真实可信的企业或个人网站,而不是一个钓鱼网站。且在网站的服务器上部署SSL证书后,可以使网站与访问者之间通过SSL协议建立安全的加密连接,确保在Web服务器和浏览…

H5编辑二维码,如何将图文、视频、文件、链接全都展示在一个页面?

在二维彩虹可以制作各种类型的二维码。今天我们要介绍的是二维彩虹的【H5编辑二维码】,包括基本功能、应用场景、制作步骤,以及其优势特点。现在就来随我们一次看看吧! 一,认识H5编辑二维码 二维彩虹的【H5编辑】是一款功能非常…

【数据分享】1999—2021年地级市劳动力就业及工资情况(Shp/Excel格式)

在之前的文章中,我们分享过基于2000-2022年《中国城市统计年鉴》整理的1999-2021年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、地方一般公共预算收支状…

【Linux命令200例】cut强大的文本处理工具

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,2023年6月csdn上海赛道top4。 🏆本文已收录于专栏:Linux命令大全。 🏆本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

关于Spring的bean的相关注解以及其简单使用方法

一、前置工作 第一步&#xff1a;创建一个maven项目 第二步&#xff1a;在resource中创建一个名字叫做spring-config.xml的文件&#xff0c;并把以下代码复制粘贴 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.sprin…

java+springboot+mysql员工宿舍管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的员工宿舍管理系统&#xff0c;系统包含超级管理员、管理员、员工角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;楼栋管理&#xff1b;宿舍管理&#xff1b;员工管理&#xff08;分配…

IntelliJ IDEA 2023.2 正式发布,彻底弃用Struts2,不再支持Win7

点击“终码一生”&#xff0c;关注&#xff0c;置顶公众号 每日技术干货&#xff0c;第一时间送达&#xff01; 1、主要更新 IntelliJ IDEA 2023.2已经到来&#xff01;此版本为IDE带来了大量令人兴奋的功能和有价值的改进。下面是本次的主要更新&#xff1a; IntelliJ IDEA 2…

【Java】智慧校园家校互通小程序源码

智慧校园家校互通小程序源码包含电子班牌系统考勤功能&#xff0c;以云服务器为基础&#xff0c;实现大数据和资源共享。是一款全功能智慧校园管理平台系统&#xff0c;融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一系列应用&#xff0c;是校园管理的现代…

如何在Linux系统上安装cpolar内网穿透

文章目录 如何在Linux系统上安装cpolar内网穿透 如何在Linux系统上安装cpolar内网穿透 cpolar作为一款体积小巧却功能强大的内网穿透软件&#xff0c;不仅能够在多种环境和应用场景中发挥巨大作用&#xff0c;还能适应多种操作系统&#xff0c;应用最为广泛的Windows、Mac OS系…

软件外包开发的流程图工具

软件开发过程中需要画流程图&#xff0c;可以更清楚的表达软件业务流程&#xff0c;减少在开发过程中的业务理解偏差&#xff0c;因此在软件开发过程中流程图工具是必不可少的软件管理工具。今天和大家分享常见的一些软件流程图工具&#xff0c;每款工具都有其自身的特色&#…