MySQL 锁分类和详细介绍

锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源,锁机制是保证数据一致性和并发性的重要手段,它的地位非常重要。

基本分类:

按照照粒度分类

全局锁:锁定数据库中的所有表。
表级锁:每次操作锁住整张表。
行级锁:每次操作锁住对应的行数据。

按照使用方式分类:

 共享锁(Shared Locks):也叫读锁(S锁),多个事务可以同时获取共享锁,用于读取数据,不阻塞其他事务的共享锁。

排他锁(Exclusive Locks):也叫写锁(X锁),只有一个事务可以获取排他锁,用于修改数据,其他事务无法获取共享锁或排他锁。

按照范围分类:

记录锁(Record Locks):用于保护数据表中的单个记录,当事务对记录进行修改时会自动获取记录锁。

间隙锁(Gap Locks):用于保护数据表中的间隙,即两个记录之间的空隙。间隙锁可以防止其他事务在该间隙中插入新记录。

临键锁(Next-Key Locks):是记录锁和间隙锁的组合,用于保护数据表中的记录和间隙。它可以防止其他事务在记录和间隙之间插入新记录。

全局锁

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

语法

-- 加锁

flush tables with read lock ;

-- 释放锁

unlock tables ;

作用和特点

1. 锁定数据库中的所有表:全局锁会锁定整个数据库,阻止其他事务对数据库中的任何表进行修改操作。

2. 阻塞其他事务:获取全局锁的事务会阻塞其他事务对数据库的写操作,确保数据的一致性。

3. 适用于短期维护操作:全局锁通常用于执行短期维护操作,例如备份数据库、导出数据等。

实际应用场景

1. 数据库备份和恢复:在进行数据库备份和恢复操作时,为了避免备份数据的不一致性,可以使用全局锁来锁定整个数据库。

2. 数据库迁移和同步:当需要将数据库迁移到其他服务器或进行数据同步操作时,全局锁可以确保数据在迁移或同步期间不会被修改。

3. 数据库维护和优化:某些数据库维护和优化操作需要对整个数据库进行操作,此时全局锁可以保证操作的有效性和数据的完整性。

表级锁

特点:

1. 锁定整张表:表级锁是在表级别上进行锁定,即一次锁定整个表,阻塞其他事务对该表的写操作。

2. 阻塞其他事务:获取表级锁的事务会阻塞其他事务对同一表的写操作,确保数据的一致性。

3. 简单高效:相对于行级锁,表级锁的实现较为简单,锁的开销较小。

分类

1. 表锁(Table Lock):

- 表锁是一种锁定整个数据表的机制,将锁应用于整张表,阻塞其他事务对该表的写操作。

- 当一个事务获取了对表的表级锁时,其他事务无法对该表进行写操作,但可以进行读操作。

- 表锁适用于对整个表进行维护操作或需要保护整个表的情况,但会对并发性能产生影响,不适用在高并发环境中。

2. 元数据锁(Metadata Lock):

- 元数据锁用于保护数据库中的元数据,如表结构、索引等。

- 当一个事务对某个元数据对象进行修改时,会获取对应的元数据锁,阻塞其他事务对同一元数据对象的访问和修改。

- 元数据锁确保了元数据的一致性和完整性,防止并发操作导致元数据的冲突或损坏。

3. 意向锁(Intention Lock):

- 意向锁是用于协调行级锁和表级锁的机制。

- 当一个事务在某一行上持有行级锁时,意向锁会阻止其他事务获取该表的表级锁,以避免冲突。

- 意向锁分为意向共享锁(Intention Shared Lock)和意向排他锁(Intention Exclusive Lock),用于指示事务在行级别上是否持有共享锁或排他锁。

表锁介绍

表锁有两种:表共享读锁(读锁)和 表独占写锁(写锁)

读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写

简单语法:lock tables 表名... read/write。

-- 获取表锁

lock tables 表名 write;

-- 执行需要锁定表的操作

update 表名 set column1 = 'value' where id = 1;

-- 释放表锁

unlock tables;

行级锁

行级锁,每次操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率最低,并发度最高,应用在InnoDB存储引擎中。

特点

1. 锁定特定行数据:行级锁是在行级别上进行锁定,即只锁定表中的某一行数据,而不是整个表。 2. 并发性高:相比于表级锁,行级锁可以提供更高的并发性能,允许多个事务同时访问表的不同行数据。

3. 粒度细:行级锁提供了更细粒度的锁定方式,可以避免不必要的锁竞争,提高并发操作效率

分类

行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

行锁介绍

InnoDB实现了以下两种类型的行锁:

共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他
锁。

操作的加锁机制

语法(行级锁需要在事务中使用):

-- 获取读锁、写锁

select ... lock in share mode;

select  ...  for update;

-- 释放锁(MySQL默认开启事务)

commit;//提交事务

rollback;//或者回滚

简单例子

-- 开启事务

start transaction;

-- 获取行级锁

select * from orders where id = 1 for update;

-- select * from orders where order_id = 1 lock in share mode;

-- 执行需要锁定行的操作

update orders set price= 100 where id = 1;

-- 提交事务,释放行级锁

commit;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【实操记录】Oracle数据整库同步至Apache Doris

本文是Oracle数据整库同步至Apache Doris实操记录,仅供参考 参考:https://cn.selectdb.com/blog/104 1、Oracle 配置 [rootnode1 oracle]# pwd /u01/app/oracle [rootnode1 oracle]# mkdir recovery_area [rootnode1 oracle]# chown -R oracle:dba re…

AndroidStudio精品插件集

官网 项目地址:Github博客地址:Studio 精品插件推荐 使用需知 所有插件在 Android Studio 2022.3.1.18(长颈鹿)上测试均没有问题,推荐使用此版本Android Studio 2022.3.1.18(长颈鹿)正式版下…

卷积神经网络-池化层和激活层

2.池化层 根据特征图上的局部统计信息进行下采样,在保留有用信息的同时减少特征图的大小。和卷积层不同的是,池化层不包含需要学习的参数。最大池化(max-pooling)在一个局部区域选最大值作为输出,而平均池化(average pooling)计算一个局部区…

人机关系不是物理关系也不是数理关系

人机关系是一种复杂的社会技术系统,涉及到人类和机器、环境之间的相互作用和影响。它不仅限于物理接触和数理规律,同时还包括了思维、情感、意愿等方面的交流和互动。在人机关系中,人类作为使用者和机器作为工具(将来可能会上升到…

Windows下使用VS2010编译出带pdb可调试的FFmpeg库

本人主要在windows环境下开发,Linux下的gpb调试工具又不如vs调试方便(使用过其他调试工具才知道,vs果真为宇宙最强调试工具),所以决定在windows编译可以调试FFmpeg,以方便调试和学习FFmpeg内部代码。 有过在…

C#,数值计算——完全VEGAS编码的蒙特·卡洛计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Complete VEGAS Code /// adaptive/recursive Monte Carlo /// </summary> public abstract class VEGAS { const int NDMX 50; const int …

基于微信小程序的付费自习室

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

【C++】一文带你走入vector

文章目录 一、vector的介绍二、vector的常用接口说明2.1 vector的使用2.2 vector iterator的使用2.3 vector空间增长问题2.4 vector 增删查改 三、总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 一、vector的介绍 vector…

【MyBatis-Plus】快速精通Mybatis-plus框架—快速入门

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

【VUE·疑难问题】定义 table 中每行的高度(使用 element-UI)

一、如何定义 table 中每一行的 height &#xff1f; 1.table例子 <!-- 二、table --><div style"overflow: hidden;display: block;height: 68vh;width: 100%;"><el-table stripe show-header style"width: 100%" :data"tableData&q…

代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

本文思路和详细讲解来自于:代码随想录 (programmercarl.com) LeetCode T102 二叉树的层序遍历 题目链接:102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 本题使用队列辅助完成,讲解主要函数CheckOrder:首先判断root是否为空,是就直接返回,然后创建…

互联网Java工程师面试题·Elasticsearch 篇·第一弹

目录 1、elasticsearch 了解多少&#xff0c;说说你们公司 es 的集群架构&#xff0c;索引数据大小&#xff0c;分片有多少&#xff0c;以及一些调优手段 。 1.1 设计阶段调优 1.2 写入调优 1.3 查询调优 1.4 其他调优 2、elasticsearch 的倒排索引是什么 3、elastic…