【享学MySQL】系列:MySQL中的锁机制

MySql 硬核解析系列 一 MySQL的锁机制 本文深度解析MySQL InnoDB存储引擎的锁机制,涵盖表级锁、行级锁、意向锁等核心概念,重点剖析记录锁、间隙锁、临键锁的实现原理及其在并发控制中的作用。文章详细阐述锁的兼容性、MVCC与锁的关系、死锁检测机制,并比较不同隔离级别下的锁行为差异,最后给出锁性能监控与优化建议。通过底层数据结构、加锁过程及实际案例的系统性分析,帮助开发者深入理解MySQL的并发控制机制。 阅读详情

我是少侠露飞。博客不仅是笔记,更是一种思考,一种分享。

引言

MySQL的锁机制是面试中的难点,也是时常让开发头疼的问题,今天少侠就做个总结。

表锁、页锁及行锁


  • 表锁,顾名思义就是锁住整张表,当一个事务在操作的时候,其它所有事务只能等待,如果是访问量比较大的表,在并发场景下可谓是灾难级的吞吐量。特点:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率高,并发度最低。
  • 页锁,就是锁住一页,我们知道MySQL数据都是一页一页加载到内存的,每页16K(比方说一个表只有一个字段,并且占据内存是8000字节,那一次只能加载两行数据到页内)。
  • 行锁,就是每次只锁定被操作的行,是比表锁、页锁维度都要小的一种锁定方式。特别需要注意的是,MySQL的行锁锁住的都是索引,而不是记录,务必牢记!特点:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。

共享锁和排它锁


  • 共享锁:共享锁又叫做读锁或S锁,加上共享锁后在事务结束之前其他事务只能再加共享锁、只能对其进行读操作不能写操作,除此之外其他任何类型的锁都不能再加了。
 # 加上lock in share mode
SELECT description FROM table lock in share mode;
  • 排他锁:排他锁又叫写锁或X锁,某个事务对数据加上排他锁后,只能这个事务对其进行读写,在此事务结束之前,其他事务不能对其加任何锁,可以读取(因为MySQL读取是不加锁的),不能进行写操作,需等待其释放。
# 加上for update
SELECT description FROM table for update; 

注意,无论是共享锁还是排它锁都是行锁。

乐观锁和悲观锁


在Java中常见的采用CAS算法实现的乐观锁的典型的例子就是原子类,通过CAS自旋实现原子操作的更新,悲观锁通常都是synchronized和Lock实现。那么MySQL中的乐观锁和悲观锁又为何呢?

  • 乐观锁:每次读数据的时候都认为其他人不会修改,所以不会上锁,而是在更新的时候去判断在此期间有没有其他人更新了数据,可以使用版本号机制。在数据库中可以通过为数据表增加一个版本号字段实现。读取数据时将版本号一同读出,数据每次更新时对版本号加一。当我们更新的时候,判断数据库表对应记录的当前版本号与第一次取出来的版本号值进行比对,如果值相等,则予以更新,否则认为是过期数据。乐观锁适用于多读的应用类型,可以提高吞吐量。
# 利用版本号进行CAS更新
UPDATE table t SET t.name='Luffy'  WHERE t.id = 1 AND version = 678768;
  • 悲观锁:每次读数据的时候都认为别人会修改,所以每次在读数据的时候都会上锁,这样别人想读这个数据时就会被阻塞。MySQL中就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在操作之前先上锁。

上节的S锁(共享锁)和X锁(排它锁)都是悲观锁。

间隙锁(Gap Lock)和Next-Key Lock


InnoDB有三种行锁的算法:

  1. Record Lock:单个记录上的锁。
  2. Gap Lock:间隙锁,锁定一个索引范围,但不包含记录本身。
  3. Next-Key Lock:Gap Lock + Record Lock,锁定一个索引范围,并且包含记录本身。

间隙锁使得InnoDB解决幻读问题,加上MVCC使得InnoDB的RR隔离级别实现了串行化级别的效果,并且保留了比较好的并发性能。

定义:当我们用范围条件检索数据时请求共享或排他锁时,InnoDB会给符合条件的已有数据的索引加锁;对于键值在条件范围内但表中并不存在的记录,叫做间隙(GAP),InnoDB也会对这个"间隙"加锁,这种锁机制就是间隙锁。
例如:table表中存在id 1-80,90-99的记录。SELECT * FROM table WHERE id < 100 FOR UPDATE。InnoDB不仅会对id值为1-80,90-99的记录加锁,也会对id在81-89之间(这些记录并不存在)的间隙加锁。这样就能避免事务隔离级别为可重复读下的幻读。

死锁


概念:两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象。
存在条件:1、 互斥条件:一个资源每次只能被一个事务使用。2、 请求与保持条件:一个事务因请求资源而阻塞时,对已获得的资源保持不放。3、不剥夺条件:已获得的资源,在末使用完之前不能强行剥夺。4、循环等待条件:形成一种头尾相接的循环等待关系。
解除正在死锁的状态:撤销其中一个事务。

手写一段死锁代码:

T1:
begin;
select * from user u where u.id=1 for update; 
update user u set u.name='Carson' where id=2;

T2:
begin;
delete from user u where u.id=2;
delete from user u where u.id=1;

多版本并发控制(MVCC)

  • 它使得InnoDB不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。
  • 实现:InnoDB实现MVCC的方法是它为每一行存储三个额外的隐藏字段:
    1. DB_TRX_ID:一个6byte的标识,每处理一个事务,其值自动+1 ,可以通过语句“show engine innodb status”来查找。
    2. DB_ROLL_PTR: 大小是7byte,指向写到rollback segment(回滚段)的一条undo log记录。
    3. DB_ROW_ID: 大小是6byte,该值随新行插入单调增加。
  • SELECT:返回的行数据需要满足的条件: 1、数据行的创建版本号必须小于等于事务的版本2、行的删除版本号(行中的特殊位被设置为将其标记为已删除)一定是未定义的或者大于当前事务的版本号,确定了当前事务开始之前行没有被删除。
  • INSERT:InnoDB为每个新增行记录当前系统版本号作为创建版本号。
  • DELETE:InnoDB为每个删除行的记录当前系统版本号作为行的删除版本号。
  • UPDATE:InnoDB复制了一条数据。这条数据的版本号使用了系统版本号。它也把系统版本号作为老数据的删除号。
  • 说明:这里的读是不加锁的SELECT等,MVCC实现可重复读使用的是读取undo中的已经提交的数据,是非阻塞的。INSERT操作时"创建时间"=DB_ROW_ID,这时"删除时间"是未定义的;UPDATE时,复制新增行的"创建时间"=DB_ROW_ID,删除时间未定义,旧数据行"创建时间"不变,删除时间=该事务的DB_ROW_ID。DELETE操作,相应数据行的"创建时间"不变,删除时间=该事务的DB_ROW_ID;

小结

本篇重点介绍了MySQL的各种锁机制,熟练其概念及在开发中正确使用是很有必要的。
我是少侠露飞,爱技术,爱分享。
祝大家国庆快乐!

深入解析MySQL事务机制和锁机制 MySQL的事务机制和锁机制是确保数据一致性和完整性的基础。通过深入理解并合理应用这些机制,可以显著提高数据库的并发处理能力和稳定性。希望本文能够帮助读者更好地掌握MySQL的事务机制和锁机制,为实际开发和运维提供有价值的参考。如果你对MySQL的事务和锁机制有更多的问题或经验分享,欢迎在评论区讨论! 阅读详情

相关推荐

关于SVPWM七段式五段式调制后的相电压和线电压波形——大疆DJI技术笔试

1.SVPWM七段式/五段式调制的相电压和线电压波形 脉宽调制(PWM)在并网变流技术中得到了广泛的应用。与正弦脉宽调制(SPWM)的控制方法相比,SVPWM方法具有直流侧电压利用率高,电压谐波小,易于数字化实现等显著的优点,从而使SVPWM在实际的应用中越来越普遍。TMS320F28335是32位浮点的DSP控制器,具有150MHz的高速处理能力,18路PWM输出,与前几代数字信号控制器相比,性能平均提高了50%。其中具体的SVPWM理论实现的原理,请参考我的博客永磁同步电机的矢量控制策略(七)一一一SV

昔时扬尘处 2万+

『 MySQL篇 』:MySQL 锁机制介绍

MySQL锁机制详解

m0_56361048的博客 8857

TI 实时操作系统SYS/BIOS使用总结

1:概述: SYS/BIOS 是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。 最大的特点就是:实时。 2:XDCtools: XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的AP

带头奋青的博客 5万+

MySQL锁机制详解

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

qq_43842093的博客 4477

自动驾驶仿真:基于Carsim开发的加速度请求模型

1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方式将请求加速度转换成对应的节气门开度与主缸压力传给动力学软件进行闭环控制。

zataji的博客 6914

保姆级教程:用再生龙Clonezilla Live给Ubuntu系统做全盘备份与恢复(含BIOS设置避坑)

本文提供了一份详细的Clonezilla Live教程,指导Ubuntu用户如何轻松完成全盘备份与恢复。从启动盘制作、BIOS设置避坑到备份参数解析和恢复操作,涵盖了所有关键步骤和常见问题解决方案,帮助用户高效保护系统数据。

weixin_42116058的博客 642

MySQL数据库锁机制(全面讲解)

在这个数据驱动的时代,数据库的重要性不言而喻。尤其是当我们面对成千上万的用户同时操作数据库时,如何保证数据不会乱套,这就得聊聊MySQL的锁机制了。锁,听起来好像有点神秘,但其实它就像是数据库的一道安全门,接下来,我会和大家一起探讨一下MySQL数据库锁的点点滴滴,包括它是怎么工作的,有哪些类型,以及在实际应用中怎么用。你能对数据库锁有个更清晰的了解,以后遇到并发问题也能更从容应对。那么,让我们开始吧!

程序员阿龙的博客 5806

vivado Block Design 设计 .tcl 文件使用,导出,修改,添加方式

在vivado中生成 Block Design可以导出tcl文件进行保存(体积小),或者在别的版本vivado中打开(版本互通),这是一个非常好的功能。另外GitHub中很多项目都是采用这种方式上传的,学会如何使用可以快速修改历程项目。

2203_75345038的博客 2494

超全MySQL锁机制介绍

了解MySQL中的锁机制对于数据库管理员和开发人员来说至关重要,它能帮助我们更好地控制并发访问,确保数据的一致性和完整性。通过合理使用不同的锁类型,我们可以提高系统的并发性能,减少锁冲突和死锁等问题。在实际应用中,需要根据具体的业务场景和需求选择合适的锁策略,并关注可能出现的问题,采取相应的优化措施。

weixin_40381772的博客 2280

Geant4 学习笔记(一):实现multi-thread多线程

简单修改实现Geant4多线程

weixin_52417815的博客 6084

Codex 100个真实案例 - 用AI批量清洗Excel脏数据(10万行3分钟搞定)

每个做数据分析的人都被"脏数据"折磨过——空值、重复行、日期格式五花八门、手机号多一位少一位……手动清洗几千行就已经让人崩溃,更别提10万行了。本文将展示如何用 Codex 生成一套完整的 Python pandas 数据清洗工具,从读取Excel/CSV、识别脏数据、自动清洗、生成清洗报告,到可视化对比清洗前后的数据质量,全程自然语言驱动,10万行数据3分钟搞定!

yueyeguzhuo的专栏 88

MySQL中的锁机制详解

事务的(隔离级别)是由锁来保证的。并发访问数据的情况分为:1.读-读即并发事务相继读取相同的记录,因为没涉及到数据的更改,所以不会有并发安全问题,允许这种情况发生。2.写-写即并发事务对相同记录进行修改,会出现问题,因为任何一种隔离级别都不允许发生脏写,所以多个未提交的事务对同一个记录修改时需要加锁,保证它们是顺序执行的。锁内存中的结构,当事务想对某条数据进行更改时,首先会查看该记录有没有与之关联的锁结构,有的话则等待它的事务被提交,锁被释放;反之没有锁则生成锁结构与该记录继续关联。......

清风 5604

3D iToF深度分辨率测量

本文展示了RGB-D传感器在三维测量中的高精度表现。标靶深度图显示其具备清晰、低噪、无干扰的特性,点云数据完整度高且轮廓分明。该技术已成功应用于物流(体积测量误差<1%)、工业(高反光部件装配检测)和农业(果蔬成熟度分级)等领域,验证了其硬件和算法的可靠性,能够满足不同场景下的三维测量需求。

dream it possible 252

【数据库】MySQL 中的锁机制

数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。...

Data · Model · Agent · Repeat 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MySQL中的锁机制详细说明

一、MySQL锁机制起步 锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制。MySQL中为了保证数据访问的一致性与有效性等功能,实现了锁机制,MySQL中的锁是在服务器层或者存储引擎层实现的。 二、行锁与表锁 首先我们来了解行锁与表锁的基本概念,从名字中我们就可以了解:表锁就是对整张表进行加锁,而行锁则是锁定某行、某几行数据或者行之间的间隙。 各引擎对锁的支持情况如下: 行锁 表锁 页锁 MyISAM √ BDB √ √ InnoDB √ √ 1. 行锁 A

周二Show 6426

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【MySQL系列】- MYSQL锁机制

InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面带来了性能损耗可能比表锁会更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表锁的。当系统并发量较高的时候,InnoDB的整体性能和MyISAM相比就会有比较明显的优势但是,InnoDB的行级锁同样也有其脆弱的一面,当我们使用不当的时候,可能会让InnoDB的整体性能表现不仅不能比MyISAM高,甚至可能会更差尽可能让所有数据检索都能通过索引来完成,避免无索引行锁升级为表锁合理设计索引,尽量缩小锁的范围。

记录总结工作过往 1327

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MySQL 锁机制

本文从加锁粒度、模式、方式三方面系统分类,重点剖析 InnoDB 存储引擎下的行级锁(记录锁、间隙锁、临键锁)及其在 REPEATABLE READ 隔离级别中防止幻读的实现原理。此外,详解了意向锁、死锁产生与检测机制、锁兼容矩阵,并对 MyISAM 与 InnoDB 的锁策略进行对比分析。文章末附实用监控命令与开发优化建议,并配备常考锁机制练习题及答案,帮助读者理论结合实战,全面掌握锁的使用场景与风险控制策略。

专注于 Agent 工程、AI 产品、Harness Engineering、LLM 算法等方向,OpenMathModel、Nivik 等开源项目作者 3万+

MySQL中的事务、索引、锁机制

Mysql学习整理

qq_39026874的博客 2302

MySQL锁机制

在这里用到MySQL的锁,本篇文章来讲下MySQL的锁机制,了解锁的种类及实现原理。锁场景问题全局锁全库逻辑备份。

weixin_43844718的博客 2501

MySQL 事务与锁机制详解

MySQL 的事务与锁机制共同构成了数据库并发控制的核心,通过遵循 ACID 原则和合理设置事务隔离级别,可以有效地保障数据的一致性和完整性。同时,了解和运用行级锁、表级锁以及意向锁等机制,对于开发者在高并发场景下优化性能至关重要。本文将从事务的基本概念、ACID 特性、事务隔离级别以及 MySQL 中的锁机制进行详细介绍,帮助开发者在实际应用中更好地设计和优化数据库操作。对关键业务逻辑进行压力测试,确保在高并发环境下事务和锁机制能正常工作,避免出现性能瓶颈。

misschen888的博客 1081

MySQL 中的锁机制

MySQL 的锁机制是其并发控制和事务隔离性的核心,尤其在 InnoDB 存储引擎中,锁的种类和加锁策略非常灵活。主要锁类型包括表级锁、行级锁和页级锁,其中 InnoDB 支持真正的行级锁。按功能分类,锁可分为共享锁(S Lock)、排他锁(X Lock)、意向共享锁(IS Lock)和意向排他锁(IX Lock),这些锁的兼容性决定了事务的并发行为。InnoDB 还引入了间隙锁和临键锁,用于防止幻读。加锁行为取决于查询语句是否使用索引、是否命中唯一索引、事务隔离级别等因素。死锁的发生通常是由于事务之间的循

红血哥 945

MySQL 锁机制详解

表级锁、行锁、意向锁、共享锁、排他锁、死锁

Bbb36921的博客 1504

mysql中的锁机制

一、mysql的锁 mysql锁机制分为表级锁、行级锁、页面锁 表级锁:每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低; 行级锁:每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高; 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 mysql中行级...

包华杰的博客 779

MySQL中的锁机制

目录 MySQL中的锁机制是什么? MySQL中锁的分类 表锁~~~ 给表加读锁 给表加写锁 MyISAM引擎中表锁的特点 MyISAM引擎中分析表锁 行锁~~~ 行锁的举例 索引失效对行锁的影响 间隙锁的危害 如何锁定一行 InnoDB引擎中行锁的特点 InnoDB引擎中分析行锁 页锁~~~ (了解即可) MySQL中的锁机制是什么? 锁是计算...

我能在河边钓一整天的鱼 284

Mysql中的锁机制

Mysql中的锁机制 原文:http://blog.youkuaiyun.com/soonfly/article/details/70238902 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一...

weixin_42652508的博客 249
上一篇: 【享学MySQL】系列:MySQL索引的数据结构,索引种类及聚簇索引和非聚簇索引
下一篇: 【享学MySQL】系列:MySQL性能调优
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值