Mysql的锁你了解哪些?

devtools/2024/10/18 5:59:48/

MySQL中的锁是用于控制多个用户对共享资源的并发访问,以确保数据的完整性和一致性。

一、按锁的性质分类

1. 乐观锁(Optimistic Locking)

        • 假设并发操作时不会发生冲突,只在提交事务时检查数据是否被其他事务修改过。

        • 适用于读多写少的场景。

        • 实现方式通常是通过记录版本号或时间戳来判断数据是否被修改。

2. 悲观锁(Pessimistic Locking)

        • 假设并发操作时会发生冲突,因此在操作期间持有锁来避免冲突。

        • 适用于写多读少的场景。

        • 实现方式通常是通过SELECT ... FOR UPDATE等语句显式地对数据加锁

二、按锁的粒度分类

1. 全局锁(Global Lock)

        • 对整个数据库实例加锁,限制除了超级用户外的所有查询和修改操作。

        • 典型用法是FLUSH TABLES WITH READ LOCK,用于全库逻辑备份。

        • 另一种方法是设置SET GLOBAL readonly=true,但不建议使用,因为它对主从复制有影响

2. 表级锁(Table-Level Lock)

        • 对整个表加锁,其他连接无法修改或读取该表的数据,但可以对其他表进行操作。

        • MyISAM存储引擎默认使用表级锁

        • 在InnoDB存储引擎中,表级锁主要用于处理DDL操作,如ALTER TABLE

3. 页级锁(Page Lock)

        • 对数据页(通常是连续的几个行)加锁,控制并发事务对该页的访问。

        • 不是所有存储引擎都支持页级锁,且其应用场景相对较少

4. 行级锁(Row-Level Lock)

        • 对单个行加锁,只锁定需要修改的数据行,其他行可以被同时修改或读取。

        • InnoDB存储引擎支持行级锁,通过索引实现。

        • 行级锁可以显著提高并发性,但需要消耗更多的系统资源

三、按锁的功能分类

1. 共享锁(Shared Lock, S锁)

        • 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

        • 典型用法是SELECT ... LOCK IN SHARE MODE

2. 排他锁(Exclusive Lock, X锁)

        • 允许获取排他锁的事务更新数据,阻止其他事务获取相同数据集的共享锁和排他锁。

        • 典型用法是SELECT ... FOR UPDATE

3. 意向锁(Intention Locks)

        • 是一种表级锁,用于表明事务稍后将对表中的某个行加锁。

        • 分为意向共享锁(IS)和意向排他锁(IX)。

4. 间隙锁(Gap Lock)

        • 锁定一个范围的键,但不包括这些键的实际值。

        • 用于防止幻读,确保索引间隙不变。

5. 临键锁(Next-Key Lock)

        • 是行锁和间隙锁的组合,锁定一个范围,并且锁定记录本身。

        • InnoDB在可重复读隔离级别下默认使用临键锁。

四、其他锁

1. 元数据锁(Metadata Lock, MDL)

        • 用于保护数据字典对象,如表结构,防止DDL与DML操作之间的冲突。

        • 当执行DDL语句时,会自动加上MDL写锁;当执行DML语句时,会自动加上MDL读锁。

五、锁的应用场景

        • 表级锁:适用于需要重建表索引或进行长时间的数据备份时。

        • 行级锁:适用于需要更新或删除某些行数据时,确保数据的一致性和完整性。

        • 间隙锁:适用于需要确保某个范围内的数据不会被其他事务修改时,如防止幻读

六、SQL演示

一、全局锁

全局锁是对整个数据库实例进行加锁。在MySQL中,可以使用FLUSH TABLES WITH READ LOCK命令来实现全局锁。

-- 对所有表加上读锁,直到执行UNLOCK TABLES
FLUSH TABLES WITH READ LOCK;-- 解锁
UNLOCK TABLES;

注意全局锁会阻塞所有除超级用户外的写操作,因此应谨慎使用,通常只在全库逻辑备份时使用。

二、表级锁

表级锁是对整个表进行加锁。在MyISAM存储引擎中,表级锁是默认的锁机制。在InnoDB存储引擎中,表级锁通常用于DDL操作。

-- 在MyISAM中,对my_table加读锁
LOCK TABLES my_table READ;-- 在MyISAM中,对my_table加写锁
LOCK TABLES my_table WRITE;-- 解锁
UNLOCK TABLES;-- 在InnoDB中,执行DDL操作时会自动加表级锁
ALTER TABLE my_table ADD COLUMN new_column INT;

三、行级锁

行级锁是对单行数据进行加锁。在InnoDB存储引擎中,行级锁是通过索引实现的,可以通过SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE来显式加锁。

-- 开启一个事务
START TRANSACTION;-- 对id为1的行加排他锁
SELECT * FROM my_table WHERE id = 1 FOR UPDATE;-- 对id为2的行加共享锁
SELECT * FROM my_table WHERE id = 2 LOCK IN SHARE MODE;-- 提交事务
COMMIT;

注意在事务提交或回滚之前,其他事务无法修改被加锁的行。

四、意向锁

意向锁是一种表级锁,用于表明事务稍后将对表中的某个行加锁。意向锁分为意向共享锁(IS)和意向排他锁(IX)。InnoDB存储引擎会自动管理意向锁,用户无需显式添加。

-- 意向锁是由InnoDB自动管理的,用户无法直接添加
-- 但是可以通过SHOW ENGINE INNODB STATUS来查看意向锁的信息

五、间隙锁和临键锁

间隙锁和临键锁是InnoDB在可重复读隔离级别下使用的锁机制,用于防止幻读。间隙锁锁定一个范围的键,但不包括这些键的实际值;临键锁则是行锁和间隙锁的组合。

-- 假设my_table有一个id列,且id为1, 2, 3的行存在-- 开启一个事务
START TRANSACTION;-- 对id在1和2之间的间隙加锁(间隙锁)
SELECT * FROM my_table WHERE id BETWEEN 1 AND 2 FOR UPDATE;
-- 此时,无法插入id为1.5的行-- 对id为2的行及其前面的间隙加锁(临键锁)
SELECT * FROM my_table WHERE id <= 2 FOR UPDATE;
-- 此时,无法插入id为1.5或2.5的行,也无法更新id为2的行-- 提交事务
COMMIT;

注意:间隙锁和临键锁是在InnoDB内部自动管理的,用户无法直接指定使用哪种锁。但是,通过选择合适的隔离级别和查询语句,可以影响InnoDB使用哪种锁。

六、元数据锁(MDL)

元数据锁用于保护数据字典对象,如表结构。当执行DDL语句时,会自动加上MDL写锁;当执行DML语句时,会自动加上MDL读锁。用户无需显式添加MDL。

-- MDL是由MySQL自动管理的,用户无法直接添加
-- 但是可以通过SHOW PROCESSLIST或INFORMATION_SCHEMA.INNODB_LOCKS等视图来查看MDL的信息-- 执行DDL语句时,会自动加上MDL写锁
ALTER TABLE my_table ADD COLUMN new_column INT;-- 执行DML语句时,会自动加上MDL读锁
SELECT * FROM my_table;


http://www.ppmy.cn/devtools/118160.html

相关文章

【Redis】分布式锁之 Redission

一、基于setnx实现的分布式锁问题 重入问题&#xff1a;获得锁的线程应能再次进入相同锁的代码块&#xff0c;可重入锁能防止死锁。例如在HashTable中&#xff0c;方法用synchronized修饰&#xff0c;若在一个方法内调用另一个方法&#xff0c;不可重入会导致死锁。而synchroni…

如何在Mac上查看剪贴板历史记录

重点摘要 macOS 内建的剪贴簿查看器可以透过 Finder 存取,但只能显示最近一次复制的内容,而且重新开机后就会清除。若要更进阶的剪贴簿管理,第三方 app 像是 CleanClip 提供了强大的功能和更好的组织方式。CleanClip 提供了全方位的剪贴簿历史管理解决方案,支援各种内容类型和…

爬虫----webpack

目录 一. 什么是webpack 出现的原因&#xff1a;同名函数 概念: 特征&#xff1a;大量缩进 webpack的格式 简单的webpack格式&#xff1a; 详细的webpack格式&#xff1a; 几个参数的运用 1. webpack数组形式 2. webpack对象格式 3.多个js文件打包 打印要扣的代码 …

大直径海油输油管测径仪的技术特点

关键字:海油输油管测径仪,输油管测径仪,海油管道测径仪,非接触测径仪,大直径测径仪, 大直径海油输油管测径仪的精度是确保海油管道直径测量准确性的关键因素&#xff0c;对于保障油气的顺畅传输与安全稳定具有重要意义。 大直径海油输油管测径仪的精度通常可以达到非常高的水平…

EE trade:黄金T+D是什么意思

黄金TD&#xff0c;全称“黄金延期交割”&#xff0c;是由上海黄金交易所推出的标准化合约&#xff0c;允许投资者以保证金的形式进行黄金交易&#xff0c;并可以选择当日交割或延期交割。它为国内投资者提供了一个全新的黄金投资渠道&#xff0c;但也存在一些风险&#xff0c;…

Spring Boot 进阶- Spring Boot如何加载自定义的配置文件?

通过之前的分析,我们知道,在Spring Boot 应用默认启动的时候会自动加载resource目录下的application.yml 或者是加载bootstrap.yml 配置文件。这些都是默认的。 在有些情况下,为了可以更好地区分不同组件的配置文件,我们需要自定义一个配置文件,我们知道,自己创建的配置文…

基于二分查找的动态规划 leetcode 300.最长递增子序列

如题&#xff1a; https://leetcode.cn/problems/longest-increasing-subsequence/description/ 其实常规动态规划的解法就没什么好说的了&#xff0c;有意思的是官方放出了一个二分查找的动态规化解法&#xff0c;时间复杂度能降到O(nlog(n))&#xff0c;但是为什么这样能解&…

学日语必备神器!这4款翻译APP你用过吗?

小伙伴们&#xff0c;你们有没有在日常生活或工作中遇到过需要翻译日语的场景呢&#xff1f;无论是阅读日本原著、工作文档还是和日本小伙伴交流&#xff0c;一个好的翻译工具绝对能成为你的贴心小助手&#xff1b;今天&#xff0c;我就来跟大家分享几款我个人非常喜欢的日语翻…