MySQL基础篇(三)锁

MySQL高级篇之锁 锁这个概念并不是MySQL数据库专有的,而是在多线程执行下,为了保证数据的正确性提出的。其中MySQL事务的隔离性是由锁来实现的。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制,因此产生了锁。同时,锁机制也为实现MSQL的各个隔离级别提供了保证。锁冲突也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。 阅读详情

目录

全局锁

概念

场景

提问

备份为什么需要加锁?

为什么不用一致性读?

为什么不使用 set global readonly = true?

表级锁

分类 

表锁

元数据锁(meta data lock,MDL)  

问题

MDL  对小表结构变更的影响?

如何安全变更小表结构?

MDL 读读不互斥,为什么对同一张表进行更新会互斥? 

当备库用 single-transaction 做逻辑备份的时候,如果从主库的 binlog 传来一个 DDL 语句会怎么样? 

行锁

两阶段锁协议

分类 

记录锁(Record Lock)

间隙锁(Gap Lock)

临键锁 (Next-Key Lock)

问题

事务会锁多行,对操作进行排序? 

死锁定义/解决策略?

如何解决热点行更新导致的性能问题? 


全局锁

概念

给整个数据库实例加锁,处于只读状态 ;数据更新语句(增删查),数据定义语句(建表修改表),更新类事务的提交语句均会被阻塞。

命令:Flush tables with read lock(FTWRL)

场景

全库逻辑备份 

主库备份:不能执行更新,业务基本停摆。

从库备份:不能执行主库同步来的 binlog,导致主从延迟。

提问

备份为什么需要加锁?

游戏购买业务:①账户余额扣除 -> ②游戏入库 

假如此时执行全库备份,并且未加锁,真正执行顺序如下:

 不加锁,备份系统得到的库不是一个逻辑时间点,视图逻辑不一致。

为什么不用一致性读?

官方自带逻辑备份工具 mysqldump,使用参数 single-transaction 时,会启动一个事务,确保拿到一致性视图。 MVCC 的支持,此时可以正常更新数据。

像 MyISAM 中引擎不支持事务,备份过程中更新,只能取到最新数据;所以 single-transaction 只适合所有表都使用事务的引擎库。

为什么不使用 set global readonly = true?

  • 有些系统,readonly 用来判断是主库还是从库 。
  • 客户端发生异常后,整个库会一直保持 readonly 状态,会导致整个库长时间处于不可写状态;而执行 FTWRL,客户端因为异常断开后,MySQL 会自动释放全局锁,恢复正常更新状态。

表级锁

分类 

表锁

lock tables ... read/write 

会限制其他线程读写,也会限制自己。

如:lock tables t1 read, t2 write;

  • 其他线程对 t1 只能读,对 t2 读写操作都会被阻塞。
  • 当前线程解锁前,对 t1 只能读,对 t2 只能读写。

元数据锁(meta data lock,MDL)  

MySQL5.5 引入

  • 读锁:增删查改(读读不互斥)
  • 写锁: 表结构变更(读写/写写互斥)

问题

MDL  对小表结构变更的影响?

  • MDL锁只有在事务提交时,才释放。 
  • 只要一处发生阻塞,后续所有加锁操作都会阻塞,表现为完全不可读写。

如何安全变更小表结构?

  • kill 掉长事务
  • 请求很频繁时,在 alter table 语句中加等待时间,超时则放弃,不阻塞后面业务;后续重试命令。 

MDL 读读不互斥,为什么对同一张表进行更新会互斥? 

在 MyISAM 上,线程 A B 要对同一张表执行更新操作(都需要 MDL读锁和表的写锁)

  • A 加 MDL读锁成功,加表的写锁成功。
  • B 加 MDL读锁成功,加表的写锁失败(等待 A 释放)。
  • 所以看起来是互斥的。 

当备库用 single-transaction 做逻辑备份的时候,如果从主库的 binlog 传来一个 DDL 语句会怎么样? 

备份最重要步骤:

  1. 获取表结构
  2. 正式导数据(获取 MDL读锁)
  3. 释放 MDL读锁

不同时刻到达的不同现象:

  • 获取表结构前到达:无影响,备份拿到的为 DDL 后的结构。
  • 正式导数据前到达:表结构被改过,报错终止。
  • 释放 MDL读锁前到达:binlog 被阻塞,主从延迟,等待 MDL读锁释放。
  • 最后到达:无影响,备份拿到的为 DDL 前的结构。

行锁

两阶段锁协议

InnoDB 事务中,行锁需要时才加上,事务结束时才释放。 

分类 

记录锁(Record Lock)

单行记录上锁。 

间隙锁(Gap Lock)

范围:左开右开 (0, 5)

隔离级别:可重复读

锁定一个范围内多行(包括不存在的数据),不包括记录本身;让其他事务无法在间隙中插入数据,以此防止同一事务两次读取出现幻读现象(出现上一次不存在的数据)。

特点:不同事务可以加相同的间隙锁,可能会引起死锁(都加锁后,都执行插入)。

临键锁 (Next-Key Lock)

范围:左开右闭 (0, 5],因为加上了行锁

隔离级别:可重复读

记录锁和间隙锁的结合,锁定范围和记录本身;InnoDB 的默认锁。 

特点:先加间隙锁,再加行锁

问题

事务会锁多行,对操作进行排序? 

最可能造成锁冲突,最可能影响并发度的锁往后放。 

购买游戏涉及以下三种操作:

  1. 修改用户账户余额(update)。
  2. 修改平台账户余额(update)。
  3. 用户游戏库添加游戏(insert)。

顺序为 3 1 2

死锁定义/解决策略?

死锁:并发系统中不同线程间存在循环资源依赖,涉及的线程都在等待其他线程释放资源,就会导致这些线程进入无限等待状态。 

策略:

  • 设置超时时间:超时退出;时间过长,影响并发度;时间过短,容易误判。
  • 主动死锁检测:每个事务被锁住时,都要查看当前线程是否被锁住,时间复杂度为线性的 O(n);需要消耗大量 CPU 资源。

如何解决热点行更新导致的性能问题? 

临时关闭死锁检测:

  • 确保业务不会出现死锁,可能会出现大量的超时(业务有损,死锁检测业务无损) 。

控制并发度:减少 InnoDB 内部死锁检测工作量

  • 使用中间件实现或者修改 MySQL 源码:在进入引擎前排队。
  • 一行改成逻辑上的多行:平台账户余额记录设成十行(总额为十行之和),每次修改余额随机选择一条记录;资源数量翻倍,冲突概率也成倍降低。
MySQL高级之锁篇 在数据库中,除传统的计算资源(如 CPU 、 RAM 、 I/O 等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对进行控制 ,因此产生了锁。同时锁机制也为实现MySQL的各个隔离级别提供了保证。锁冲突也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。数据库的锁是为了解决事务的隔离性问题,为了让事务之间相互不影响,每个事务进行操作的时候都会对数据加上一把特有的锁,防止其他事务同时操作数据。 阅读详情

相关推荐

mysql之行锁和表锁篇

mysql之行锁和表锁详解

qq_42158153的博客 1782

备用库做逻辑备份时,主库执行了一个DDL语句会怎么样

当备库用–single-transaction 做逻辑备份的时候,如果从主库的 binlog 传来一个 DDL 语句会怎么样?假设这个 DDL 是针对表 t1 的, 这里我把备份过程中几个关键的语句列出来: Q1:SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; Q2:START TRANSACTION WITH CONSISTENT SNAPSHOT; /* other tables */ Q3:SAVEPOINT sp; /* 时刻 1

ChengYanan的博客 723

SVG绘制圆环进度条

在我们的大屏可视化项目中,经常会用到各种各样的图表。与传统的表格展示、枯燥的文字阐述相比,图表展示则使用户看起来更加直观、数据的展示则更加一目了然。本文基于svg绘图技术结合前端技术栈vue,以工作中常用的环形进度条为例,简单阐述一下绘制进度条的一些思路。............

qq_40289557的博客 8358

mysql中的锁机制(行锁、表锁和全局锁)

文章目录1、概述2、行级锁2.1 共享锁和排他锁2.2 意向共享锁和意向排他锁2.3 间隙锁(Next-Key锁)2.4 举例2.5 死锁和死锁检测3、表级锁3.1 表锁3.2 元数据锁(meta data lock,MDL)4、全局锁5、面试题5.1 全局锁相关5.2 行锁相关 1、概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyI...

跨语言,跨平台,跨应用 3557

比特大陆校招笔试

我当时做的时候没有概念(上边倒计时我一直以为是一个模块的),所以第一个模块写的太长了导致最后才留15分钟快速选的(一共18道题),有一题最后没有选上,两题没有认真看题目瞎选的,求求求过过过!选择题:主要考高中物理题、数学题(念过高中的一定会,但是需要时间算,需要留25分钟左右的时间做)第一道就是写个人的内容,什么最近读过的书,最近的感受等等;分为两个模块,考试内容超级无敌简单,但是注意时间掌握。注意这里别花太长的时间,不然后边来不及。第二道逻辑分析题,需要你写解答。

Domainwa的博客 668

项目方案:社会视频资源整合接入汇聚系统解决方案(五)

视频监控接入和视频汇聚平台,形成整合平台,平台服务层包括编码设备、存储设备、解码设备等的接入服务,提供基础视频服务、传输服务、存储服务、控制服务及事件服务。两种不同的接入方式:监控设备接入,是指接入社会单位视频监控系统的DVR(数字硬盘录像机)、DVS和IPC、DVR/NVR、CVR等设备;平台对接,是指对接接入社会单位数字视频监控平台。AS-VAG视频监控接入网关支持onvif、国标等接入,也支持多种SDK接入方式,包括国产的主流品牌支持海康、大华、宇视、华为等SDK,国际品牌支持松下和axis等SDK。

weixin_70208651的博客 2464

mysql高级篇三:mysql锁问题

文章目录锁概述锁分类Mysql 锁MyISAM 表锁如何加表锁读锁案例写锁案例结论查看锁的争用情况InnoDB 行锁行锁介绍背景知识InnoDB 的行锁模式案例准备工作行锁基本演示无索引行锁升级为表锁间隙锁危害InnoDB 行锁争用情况5.5.9 总结 锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的计算资源(如 CPU、RAM、I/O 等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突

qq_49723651的博客 1217

智能车竞赛飞檐走壁组立体赛道电磁引导线设计与实现

本文深入解析了智能车竞赛飞檐走壁组立体赛道电磁引导线的核心设计与实现。针对垂直面、圆筒、跷跷板等立体元素,详细阐述了电磁线规格参数选择、三维空间铺设技巧及磁场调试方法,旨在帮助参赛队伍打造稳定可靠的导航系统,提升车模在复杂立体赛道上的通过率与稳定性。

bert9linguist的博客 279

MySQL 锁篇(三)

不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。当我们要执行 update 语句的时候,确保 where 条件中带上了索引列,并且在测试机确认该语句是否走的是索引扫描,防止因为扫描全表,而对表中的所有记录加上锁。我们可以打开 MySQL sql_safe_updates 参数,这样可以预防 update 操作时 where 条件没有带上索引列。

weixin_44681349的博客 180

Honeywell EPKS 核心功能块组态与执行调度实战解析

本文深入解析Honeywell EPKS系统的核心功能块组态与执行调度技术,涵盖控制模块(CM)、顺序控制模块(SCM)和输入输出模块(IOM)的配置方法。通过实战案例分享执行顺序(ORDERINCM)和CEE执行周期的优化策略,帮助工程师提升工业自动化系统的控制精度和运行效率。

weixin_28724319的博客 414

Win11下Edge浏览器CPU占用飙升?试试这5个隐藏设置(附实测对比图)

本文详细解析了Win11下Edge浏览器CPU占用飙升的原因,并提供了5个关键设置优化方案,包括禁用硬件加速、管理扩展程序等,有效降低资源消耗。实测数据显示优化后CPU占用显著下降,适合Win11用户提升浏览器性能。

weixin_29266679的博客 1505

程序员必须知道的MySQL高级篇 锁(三)

程序员必须知道的MySQL高级篇(二)1. Mysql中的锁1.1 锁概述1.2 锁分类1.3 Mysql 锁1.2 MyISAM 表锁1.2.1 如何加表锁1.2.2 读锁案例1.2.3 写锁案例5.2.4 结论1.2.5 查看锁的争用情况1.3 InnoDB 行锁1.3.1 行锁介绍1.3.2 背景知识1.3.3 InnoDB 的行锁模式5.3.4 案例准备工作5.3.5 行锁基本演示5.3.6 无索引行锁升级为表锁5.3.7 间隙锁危害5.3.8 InnoDB 行锁争用情况1.3.9 总结2. 常用S

输入技术、输出想法 620

Docker Desktop 从 C 盘迁移到 D 盘的正确方法

本文介绍了三种将Docker数据目录从C盘迁移到D盘的方案。方案1针对WSL2用户,通过导出/导入虚拟磁盘实现迁移;方案2采用软链接方式,适合所有Docker模式;方案3则建议重装Docker到D盘。其中WSL2迁移方案(方案1)最为稳定可靠,推荐使用。文章详细说明了各方案的操作步骤及注意事项,并提供了迁移后常见问题的解决方法,帮助用户彻底解决Docker占用C盘空间的问题。

sg_knight的专栏 2176

MySql详解(三)--锁和事务篇

Mysql-详解,看这篇就够了

qq_35105015的博客 1315

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,

KJ.JK 1071

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

《MySQL高级篇》十三、锁

两万字带你走进MySQL锁的海洋~ 面试必备!!!

LXYDSF的博客 5425

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MySQL高级篇——锁

mysql中的锁根据粒度分为行锁、页锁、表锁。根据锁自身的操作类型分为共享锁和排他锁。行锁分为记录锁、间隙锁、临键锁、插入意向锁。表锁分为表级共享锁排他锁、意向锁、mdl锁、自增锁。

qq_51114283的博客 9254

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

efm32 入门.pdf

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

【MySQL锁】基础篇

MySQL中为了保证数据访问的一致性与有效性等功能,实现了锁机制,MySQL中的锁是在服务器层或者存储引擎层实现的。

Eucalyptus's blog 1416

MySQL锁篇

这就奇怪了,上文不是说锁住的区域不都是(1006,+无穷] 的 next-key lock 吗?那么当在 age = 39 这条记录的二级索引上加了范围为(22,39)的间隙锁后,其他事务是无法插入一个 age = 22,id = 12 的新记录,因为当其他事务插入一条 age = 22,id = 12 的新记录时,在二级索引定位到插入的位置,而该位置的下一条是 id = 20,age = 39 的记录,正好该记录的二级索引上有间隙锁,所以这条插入语句会被阻塞,无法插入成功,这样就可以避免幻读现象的发生。

songbijian的博客 1821

【MySQL锁篇】一、MySQL当中有哪些锁

MySQL有哪些锁

weixin_56738054的博客 3050

MySQL 篇-深入了解 MySQL 锁的机制(表锁、意向锁、行锁、间隙锁、临键锁等)

对于一张表进行数据的增删改的时候,会自动加上 shared_write 锁,而进行查询的时候,会自动加上 share_read 锁,对于 shared_write 与 shared_read 都是兼容的。可以发现,在 3 加上了临键锁,将 3 的行数据锁上,还把 3 之前的全部间隙锁上,再有 3 的行锁,将 3 的行数据锁上,再接着将 3 - 7 之间的全部间隙锁上。此时锁的类型为间隙锁,将 id 为 8 - 10 之间的空隙锁起来了,而 id 为 8 和 10 的行数据不会被锁起来,锁的只是间隙。

小扳手 2363

【MySQL修炼篇】从S锁/X锁到Next-Key Lock:MySQL锁机制硬核拆解

本文系统讲解了MySQL数据库锁机制的核心要点,涵盖S锁/X锁的基础原理、表锁与行锁的粒度差异、间隙锁与Next-Key Lock解决幻读的方案,以及死锁的成因与排查方法。文章指出锁机制是保障数据一致性和并发性能的关键,详细分析了各类锁的特性和适用场景,并提供了死锁排查的4个核心步骤和优化建议。通过理解这些锁机制,开发者可以更好地处理线上并发问题,在系统设计阶段规避潜在风险,提升系统高可用性。

m0_58782205的博客 2363

【MySQL基础】锁

MySQL中的各种锁

scj1022的博客 1923

【MySQL实战45讲笔记】基础篇——行锁

MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB 是支持行锁的,这也是 MyISAM 被 InnoDB 替代的重要原因之一。

m0_60511809的博客 1173

MySQL高级篇知识点——锁

锁

代码星辰的博客 5628
上一篇: MySQL基础篇(二)事务隔离 & 索引
下一篇: 线程池原理
皮皮杨233
博客等级 码龄7年 42粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值