MySQL-锁相关概念整理

【MySQL】如何理解MySQL的锁(图文并茂,一网打尽) 这里博主整理我们常见的MySQL中锁的概念,还介绍了面试中 常问的关于乐观锁、悲观锁的 一些特点。后续还有更多内容与大家分享~ 阅读详情

锁的基本概念
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

三种类型(级别)的锁定机制
MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。MySQL的锁机制是由使用存储引擎决定的。MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

四类事务隔离级别
MySQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。

Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

事物隔离引起的三种读取问题
脏读(Dirty Read)
脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚

不可重复读(Unrepeatable Read)
不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。
例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改。事务B中再次查询时,数据发生了改变

幻读(phantom read)
幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.

InnoDB使用的七种锁
在这里插入图片描述
自增锁
自增锁是一种特殊的表级别锁(table-level lock),专门针对事务插入AUTO_INCREMENT类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。

共享/排他锁
共享/排它锁是标准的行级锁(row-level locking)
事务拿到某一行记录的共享S锁,才可以读取这一行;
事务拿到某一行记录的排它X锁,才可以修改或者删除这一行;
多个事务可以拿到一把S锁,读读可以并行;
而只有一个事务可以拿到X锁,写写/读写必须互斥;
共享/排它锁的潜在问题是,不能充分的并行,解决思路是数据多版本

意向锁
意向锁是指,未来的某个时刻,事务可能要加共享/排它锁了,先提前声明一个意向。 意向锁有这样一些特点:
首先,意向锁,是一个表级别的锁(table-level locking);
意向锁分为:
意向共享锁(intention shared lock, IS),它预示着,事务有意向对表中的某些行加共享S锁
意向排它锁(intention exclusive lock, IX),它预示着,事务有意向对表中的某些行加排它X锁
举个例子:
select … lock in share mode,要设置IS锁;
select … for update,要设置IX锁;
意向锁协议(intention locking protocol)并不复杂:
事务要获得某些行的S锁,必须先获得表的IS锁
事务要获得某些行的X锁,必须先获得表的IX锁
由于意向锁仅仅表明意向,它其实是比较弱的锁,意向锁之间并不相互互斥,而是可以并行的。
排它锁是很强的锁,不与其他类型的锁兼容。这也很好理解,修改和删除某一行的时候,必须获得强锁,禁止这一行上的其他并发,以保障数据的一致性。

插入意向锁
插入意向锁,是间隙锁(Gap Locks)的一种(所以,也是实施在索引上的),它是专门针对insert操作的。
多个事务,在同一个索引,同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此。
思路总结
InnoDB使用共享锁,可以提高读读并发;
排他锁,为了保证数据强一致,InnoDB使用强互斥锁,保证同一行记录修改与删除的串行性;
InnoDB使用插入意向锁,可以提高插入并发;

记录锁
记录锁,它封锁索引记录,例如: select * from t where id=1 for update;
它会在id=1的索引记录上加锁,以阻止其他事务插入,更新,删除id=1的这一行。
说明: select * from t where id=1; 则是快照读(SnapShot Read),它并不加锁。

间隙锁
它封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围。
select * from t
where id between 8 and 15
for update;
这个SQL语句会封锁区间,以阻止其他事务id=10的记录插入。
间隙锁的主要目的,就是为了防止其他事务在间隔中插入数据,以导致“不可重复读”
如果把事务的隔离级别降级为读提交(Read Committed, RC),间隙锁则会自动失效。

临键锁
临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。
更具体的,临键锁会封锁索引记录本身,以及索引记录之前的区间。
临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。

乐观锁/悲观锁/死锁
乐观锁:
乐观锁是一种思想!其核心思想是:这个模式没有从数据库加锁!
其"锁"概念的实现是:通过一些方式来判断数据库数据是否变动,如果未变动,则修改数据;如果发现数据变动,则不修改数据。

悲观锁:
悲观锁的话其实很简单(手动加行锁就行了)
select * from xxxx for update
在select 语句后边加了 for update相当于加了排它锁(写锁),加了写锁以后,其他的事务就不能对它修改了!需要等待当前事务修改完之后才可以修改.
也就是说,如果张三使用select … for update,李四就无法对该条记录修改了~

死锁:
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

参考博客:https://www.cnblogs.com/sessionbest/articles/8689071.html
https://blog.youkuaiyun.com/oqkdws/article/details/82318157
https://blog.youkuaiyun.com/With_Her/article/details/81535813

Badcase归因分析“四部曲” badcase是业内的专业名词,简单解释一下。bad是坏,case是案例,说白了就是模型或者具体规则无法很好预测的那些案例。以分类模型为例,本来一个样本应该是负类的,结果预测为正类,那这个样本就能被称为bad case。那相对应的就是good case就是优秀案例。 阅读详情

相关推荐

第一篇:常见CAN错误帧及其排查方向

在本文中主要阐述各类错误帧的形成原因以及在使用同星硬件设备出现错误帧时,应当 如何进行排查并消除错误帧。在 CAN 总线通信中,通常遇见的错误帧主要为以下五种,其 分别是:bit error、ACK error、stuff error、CRC error 以及 form error。

u013089100的博客 1745

了解一下什么是锁

在操作数据时,认为不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断是否修改了数据:如果修改数据则放弃操作,否则执行操作。:悲观锁在操作数据时,认为会同时修改数据。是一种同步机制,用在有许多执行线程的环境中强制对资源的访问限制。是指两个或以上的进程执行过程中,因竞争共享资源造成的相互等待的过程。数据库的锁是为了支持对共享资源的进行并发访问,提供数据的完整性和统。一性,保证在高并发的情况下,访问数据库的时候,数据不会出现问题。线程:偏向锁、轻量级锁、重入锁、读写锁。表锁,行锁,排他锁,共享锁。

yvdanjiangsu的博客 626

TI电量计BQ40Z50R2循环学习实战:从量产文件生成到关键标志位解析

本文详细解析了TI电量计BQ40Z50R2的循环学习实战流程,从量产文件生成到关键标志位解析。通过实战案例和易错分析,帮助工程师避开常见陷阱,提升电量计配置效率。重点介绍了循环学习前的准备工作、量产文件生成步骤及关键标志位的深度解读,适用于电池管理系统开发人员。

weixin_30505225的博客 439

MySQL锁机制详解

会话192.168.11.101(1)”给表locktab加了锁,其他会话的操作:1、可以对其他表(表locktab以外的表)进行读、写操作。2、对表locktab:读操作可以,写操作需要等待释放锁。

qq_43842093的博客 4477

解密DS90UB983-Q1的汽车电子魔法:如何通过FPD-Link IV实现4K视频的无缝传输

本文深入解析了德州仪器DS90UB983-Q1串行器芯片如何通过FPD-Link IV技术在汽车电子中实现4K视频无缝传输。文章详细介绍了该技术的核心功能,包括多流传输(MST)模式、热插拔检测(Hot Plug Detect)机制以及电磁兼容性设计,为车载信息娱乐系统提供了高带宽、低延迟的可靠解决方案。

i3j4k5的博客 242

解锁机器人动态平衡算法:从原理到实践

机器人的动态平衡,是指机器人在运动过程中,面对各种复杂的动态变化和外界干扰,依然能够维持稳定状态,不发生倾倒或失去控制的能力。它就像是一位技艺精湛的舞者,在舞台上翩翩起舞时,无论做出多么复杂的动作,都能巧妙地调整身体姿态,始终保持平衡,展现出优美的舞姿。在实际应用中,机器人的动态平衡对于其稳定运行起着至关重要的作用。以双足机器人为例,当它行走在不平整的地面上时,地面的起伏会使机器人的重心不断发生变化。如果没有良好的动态平衡能力,机器人就很容易因为重心偏移而摔倒,无法完成行走任务。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 3838

【史上最全】MySQL各种锁详解:一文搞懂MySQL的各种锁

隐式上锁(默认,自动加锁自动释放)显式上锁(手动)解锁(手动)1. 提交事务(commit)2. 回滚事务(rollback)3. kill 阻塞进程为什么上了写锁,别的事务还可以读操作?因为InnoD‍B有,可以使用快照读,而不会被阻塞。单个行记录上的锁(点查)Record Lock总是会去锁住索引记录,如果InnoDB存储引擎表建立的时候没有设置任何一个索引,这时InnoDB存储引擎会使用隐式的主键来进行锁定。

木牛的博客 7275

开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记

本文系统介绍了稳压电源的基础知识与应用实验。首先阐述了稳压电源的定义与类型,包括线性稳压电源(如LM7805/7905)和开关稳压电源(降压/升压/升降压式)的工作原理、参数特点及优劣势。随后详细讲解了各类稳压电源的实验设计,如线性稳压电源的电路实现、开关稳压电源的PWM控制方法等。最后汇总了硬件工程师相关的笔试面试资源,涵盖器件知识、电路仿真、企业真题等内容。全文结合理论分析与Multisim仿真,为电子工程学习者提供了稳压电源的实用技术参考。

XU157303764的博客 1640

MySQL锁相关——锁机制、表锁、行锁、死锁、锁优化等

MySQL不同的存储引擎支持不同的锁机制,所有存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现。默认情况下表锁和行锁都是自动获得的,不需要额外的命令,但某些情况下用户需要明确的进行行锁或进行事务的控制,以便确保整个事务的完整性,这样就需要使用事务控制和锁定语句来完成。默认情况下,写锁比读锁具有更高的优先级:当一个锁释放时,这个锁会优先给写锁队列中等候的获取锁请求,然后再给读锁队列中等候的获取锁请求。对于普通的select语句,InnoDB不会加任何锁。

weixin_43816711的博客 5133

Open3D 体素下采样【2026最新版】

体素滤波,博客长期更新,本文最近更新时间为:2026年4月11日。

点云侠的博客 37万+

SKUA-GOCAD入门教程-第七节 点的创建与编辑3

本文介绍了四种从井数据创建点集的方法

江洋大葱的博客 963

数据库面试题整理

常见数据库面试题整理,持续更新

月小泪 648

(27)FPGA实现AD7768接口(六)

AD7768/AD7768-4 为8通道和4通道24位同步采样模数转换器(ADC)。通过可选的功耗模式和数字滤波器选项可重新配置AD7768/AD7768-4以适应多种应用,如工业输入/输出模块、仪器仪表、音频测试、控制回路和状态监控。FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。

m0_46498597的博客 997

终于整理完了,一套你真正需要的全网最全JAVA面试八股文

今天为大家整理了目前互联网出现率最高的大厂面试题,所谓八股文也就是指文章的八个部分,文体有固定格式:由破题、承题、起讲、入题、起股、中股、后股、束股八部分组成,题目一律出自四书五经中的原文。而JAVA面试八股文也就是为了考验大家的JAVA基础功底,所以强烈建议背诵全文。接触开发至今已有8年多,从实习到带团队,也算总结出了一部分经验!如果分享的东西对读者朋友们来说,有价值,有干货!能够给到帮助!这就是我写这篇文章的目的!

m0_71777195的博客 212

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java性能优化推荐书!mysql替换某个字段的某个字符串

01 蚂蚁金服面试题之MySQL 之前的阿里面试题都有做总结,具体面试题内容整理成了文档,本文是针对MySQL系列的,所以下面只展示了自己第一次面试阿里时被吊打问到的一些MySQL难题。 1、请解释关系型数据库概念及主要特点? 2、请说出关系型数据库的典型产品、特点及应用场景? 3、请详细描述 SQL 语句分类及对应代表性关键字。 4、什么是 MySQL 多实例,如何配置 MySQL 多实例? 5、如何加强 MySQL 安全,请给出可行的具体措施? 6、误操作执行了一个 drop 库 SQL 语句,如何完整

m0_57066131的博客 143

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MySQL死锁、锁、索引相关资料整理

1.MySQL文档说明 1.1InnoDB死锁 https://dev.mysql.com/doc/refman/5.6/en/innodb-deadlocks.html 死锁是指不同的事务都无法继续的情况,由于每个事务都持有另一个需要的锁导致。因为两个事务都在等待资源可用,所以它们都不会释放它所拥有的锁。 当事务锁定多个表中的行(通过如UPDATE或SELECT ... FOR ...

adrninistrat0r的博客 2013

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Mysql关于索引,事务与锁的面经初步整理 Apr 24

笔者关于实习阶段的关于MySQL的索引事务锁这样痛点整理

m0_68818004的博客 1107

mysql 锁相关问题整理

mysql中有哪几种锁? 答:全局锁、表级锁、行锁、间隙锁、next-key lock(间隙锁和行锁) 全局锁的使用场景有哪些? 答:做全库的逻辑备份 启用全局锁的方式有哪些? 答:flush tables with read lock(FTWRL)执行这个命令会使整个库处于只读状态 mysqldump逻辑备份工具,当使用-signle-transaction参数的时候,导数据之前会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据时可以正常更新的 set global r..

Niu_KL的博客 209

【MySQL笔记】正确的理解MySQL中让你想到就烦的各种锁(一)

了解一下MySQL的锁机制 行表分类: 行锁 表锁 表锁也分为表级读锁(共享锁),表级写锁(排他锁) 粒度粗细分类: 共享锁和排他锁 (Shared and Exclusive Locks) 意向锁(Intention Locks) 记录锁(Record Locks) 间隙锁(Gap Locks) 临键锁 (Next-Key Locks) 插入意向锁(Insert Intention Loc...

长路漫漫的歇脚处 3168

MySQL中关于事务和锁的常见执行命令整理包括版本区别

MySQL中关于事务和锁的常见执行命令实例整理,并标注了不同版本下的区别(如MySQL 8.0与旧版本的差异): 二、锁相关命令 1. 共享锁与排他锁 命令 描述 版本差异 手动获取共享锁(允许其他事务读,但禁止写) MySQL 8.0之前使用此语法。 MySQL 8.0+ 的优化版共享锁写法 MySQL 8.0+ 新增,替代 。 手动获取排他锁(禁止其他事务读和写) 通用语法,无版本差异。 2. 表级锁 命令 描述 版本差异 获取表级共享锁(只读) 通

关注我学习编程不迷路 775

MySQL中的锁 最详细的讲解

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态。DDL语句,DML语句和已经更新操作的事务提交语句都将被阻塞。表级锁就是对表实例加锁。表锁:表共享读锁(Table Read Lock):又称为表读锁,允许一个事务锁定的表进行读取操作,不允许其他事务对其进行写操作,但是可以进行读操作。读锁之间是不会互相阻塞的。lock tables 表名... readunlock tables / 客户端断开连接。

RanlyRan的博客 1845

MySQL锁相关

前言 关于数据库锁,是一个很重要的知识点; 不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下); 一般也就听过常说的乐观锁和悲观锁,了解过基本的含义之后就没了,没有去实际的操作过,本文将简单的整理一下数据库锁的知识,希望对大家有所帮助; 引入 本文参考文章:数据库的两大神器 数据库锁 简介 在MySQL中锁看起来是很复杂的,因为有一大堆...

weixin_34283445的博客 177

深入理解 MySQL 中的锁机制:行锁、表锁及其他锁类型

锁是数据库管理系统(DBMS)中一种控制对数据库资源访问的机制。当多个用户或事务试图同时访问同一数据时,锁能够确保数据的一致性,避免发生数据损坏或不一致的情况。锁可以分为多种类型,包括共享锁、排他锁、行锁和表锁等。MySQL 还提供了自定义锁的机制,允许用户在应用层面进行锁管理。用户锁可以通过GET_LOCK()和函数来实现。这种锁不受 InnoDB 存储引擎的限制,可以用于控制任何需要同步的资源。灵活性:可以根据具体需求自定义锁的名称和作用范围。跨会话。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1万+

Mysql 会导致锁表的语法

最近再找一些Mysql锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便大家。 此测试环境 Mysql 5.5 基于innodb 引擎 insert into table1 values select … from table2 …. 此种方法,会锁tabl...

keketrtr的专栏 2278

mysql锁知识笔记

mysql锁问题在面试时被问到数次,之前也看过相关博客,但是单纯看过总是很容易遗忘,这里做一个mysql锁面试的知识点整理。 一、存储引擎(常见两种MyISAM和InnoDB) MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。 Inno...

noob9527的博客 206

八股文之Mysql锁详解

Go语言八股文之Mysql锁详解

大学生小郑的博客 933
上一篇: 微信支付
下一篇: 基于java8的List、int[ ]、Integer[ ]的相互转换
jack_too
博客等级 码龄9年 17粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值