MySQL 的锁

news2024/12/28 2:31:34

目录

一、锁的分类

二、全局锁、表级锁、页级锁、行级锁

三、乐观锁和悲观锁

四、共享锁和排它锁

五、意向共享锁和意向排它锁

六、间隙锁、临键锁、记录锁


锁的分类和用途

一、锁的分类

1、MySQL锁可以按模式分类为:

  • 乐观锁
  • 悲观锁。

2、按粒度分可以分为:

  • 全局锁
  • 表级锁
  • 页级锁
  • 行级锁。

3、按属性可以分为:

  • 共享锁
  • 排它锁。

4、按状态分为:

  • 意向共享锁
  • 意向排它锁。

5、按算法分为:

  • 间隙锁
  • 临键锁
  • 记录锁。

二、全局锁、表级锁、页级锁、行级锁

1、全局锁

(1) 概念

全局锁就是对整个数据库实例加锁。

(2) 应用场景

全库逻辑备份(mysqldump)
(3) 实现方式

MySQL 提供了一个加全局读锁的方法,命令是Flush tables with read lock (FTWRL)。

当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。

风险点:

  • 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就能停止。
  • 如果在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。

解决办法:
mysqldump使用参数--single-transaction,启动一个事务,确保拿到一致性视图。而由于MVCC的支持,这个过程中数据是可以正常更新的。

2. 表级锁

(1) 概念

当前操作的整张表加锁,最常使用的 MyISAM 与 InnoDB 都支持表级锁定。

MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。

(2) 实现方式

表锁:lock tables … read/write;

例如lock tables t1 read, t2 write; 命令,则其他线程写 t1、读写 t2 的语句都会被阻塞。同时,线程 A 在执行 unlock tables 之前,也只能执行读 t1、读写 t2 的操作。连写 t1 都不允许,自然也不能在unlock tables之前访问其他表。

元数据锁:MDL 不需要显式使用,在访问一个表的时候会被自动加上,在 MySQL 5.5 版本中引入了 MDL,当对一个表做增删改查操作的时候,加 MDL读锁;当要对表做结构变更操作的时候,加 MDL 写锁。

(3) 风险点:
给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。在对大表操作的时候,肯定会特别小心,以免对线上服务造成影响。而实际上,即使是小表,操作不慎也会出问题。

(4) 解决办法

首先我们要解决长事务,事务不提交,就会一直占着 MDL 锁。在 MySQL 的information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。如果你要做 DDL 变更的表刚好有长事务在执行,要考虑先暂停 DDL,或者 kill 掉这个长事务。这也是为什么需要在低峰期做ddl 变更。

3、页级锁

页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。因此,采取了折衷的页级锁,一次锁定相邻的一组记录。BDB 引擎支持页级锁。

4.行级锁

(1) 概念

行级锁是粒度最低的锁,发生锁冲突的概率也最低、并发度最高。但是加锁慢、开销大,容易发生死锁现象。

MySQL中只有InnoDB支持行级锁,行级锁分为共享锁排他锁

(2) 实现方式

在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking。

三、乐观锁和悲观锁

1. 乐观锁

(1) 概念

乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。

(2) 应用场景

适用于读多写少,因为如果出现大量的写操作,写冲突的可能性就会增大,业务层需要不断重试,会大大降低系统性能。

2. 悲观锁

(1) 概念

悲观锁,正如其名,具有强烈的独占和排他特性,每次去拿数据的时候都认为别人会修改,对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。

(2) 应用场景

适用于并发量不大、写入操作比较频繁、数据一致性比较高的场景。

(3) 实现方式

在MySQL中使用悲观锁,必须关闭MySQL的自动提交,set autocommit=0。共享锁排它锁悲观锁的不同的实现,它俩都属于悲观锁的范畴。

四、共享锁和排它锁

1. 共享锁

(1) 概念

共享锁,又称之为读锁,简称S锁,当事务A对数据加上读锁后,其他事务只能对该数据加读锁,不能做任何修改操作,也就是不能添加写锁。只有当事务A上的读锁被释放后,其他事务才能对其添加写锁。

(2) 应用场景

共享锁主要是为了支持并发的读取数据而出现的,读取数据时,不允许其他事务对当前数据进行修改操作,从而避免”不可重读”的问题的出现

适合于两张表存在关系时的写操作,拿mysql官方文档的例子来说,一个表是child表,一个是parent表,假设child表的某一列child_id映射到parent表的c_child_id列,那么从业务角度讲,此时我直接insert一条child_id=100记录到child表是存在风险的,因为刚insert的时候可能在parent表里删除了这条c_child_id=100的记录,那么业务数据就存在不一致的风险。正确的方法是再插入时执行select * from parent where c_child_id=100 lock in share mode,锁定了parent表的这条记录,然后执行insert into child(child_id)values (100)就不会存在这种问题了。

(3) 实现方式

select …lock in share mode

2. 排它锁

(1) 概念

排它锁,又称之为写锁,简称X锁,当事务对数据加上写锁后,其他事务既不能对该数据添加读写,也不能对该数据添加写锁,写锁与其他锁都是互斥的。只有当前数据写锁被释放后,其他事务才能对其添加写锁或者是读锁。

MySQL InnoDB引擎默认update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型。

(2) 应用场景

写锁主要是为了解决在修改数据时,不允许其他事务对当前数据进行修改和读取操作,从而可以有效避免”脏读”问题的产生

(3) 实现方式

select …for update

五、意向共享锁和意向排它锁

1. 概念

意向锁是表锁,为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。

2. 作用

当有事务A有行锁时,MySQL会自动为该表添加意向锁,事务B如果想申请整个表的写锁,那么不需要遍历每一行判断是否存在行锁,而直接判断是否存在意向锁,增强性能。

3. 意向锁的兼容互斥性

意向共享锁(IS)意向排他锁(IX)
共享锁(S)兼容互斥
排他锁(X)互斥互斥

六、间隙锁、临键锁、记录锁

概念

记录锁、间隙锁、临键锁都是排它锁,而记录锁的使用方法跟排它锁介绍一致。

1、记录锁

记录锁是封锁记录,记录锁也叫行锁,例如:

select *from goods where **`id`=**1 for update;

它会在 id=1 的记录上加上记录锁,以阻止其他事务插入,更新,删除 id=1 这一行。

2、间隙锁

间隙锁基于非唯一索引,它锁定一段范围内的索引记录。使用间隙锁锁住的是一个区间,而不仅仅是这个区间中的每一条数据。

select* from goods where id between 1 and 10 for update;

即所有在(1,10)区间内的记录行都会被锁住,所有id 为 2、3、4、5、6、7、8、9 的数据行的插入会被阻塞,但是 1和 10 两条记录行并不会被锁住。

3、临键锁

临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间,是一个左开右闭区间临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。

每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。需要强调的一点是,InnoDB 中行级锁是基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁。


巨人的肩膀:史上最全MySQL各种锁详解 - 掘金

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第三章——MindSpore云上调试调优

1.ModelArts云上调试调优 ModelArts密钥初始化 详细教程: 初始化OBS服务 创建训练作业 2.MindSpore IDE插件效率提升 通过智能代码块推荐、代码自动补全等特性,提升MindSpore脚本开发效率,对接ModelArts云服务,实现模型训…

龙芯2K1000实战开发-时钟设计

文章目录 概要整体架构流程技术名词解释技术细节小结概要 提示:这里可以添加技术概要 本文主要结合项目方案,结合相应外设需求,设计单板时钟方案 整体架构流程 提示:这里可以添加技术整体架构 整体单板时钟方案,分为两部分。 一部分是:以CPU为核心,包括自身一些控…

VR全景智慧城市:构筑未来城市的数字化大融合

引言: 现代城市正处于数字化时代的浪潮之中,而在这个数字化浪潮中,VR全景智慧城市正以令人瞩目的方式崭露头角。随着虚拟现实(VR)技术的不断进步和智慧城市的发展需求,VR全景智慧城市作为数字技术与城市发展…

openGauss Developer Day 2023 | 邀您参加海量数据分论坛

尊敬的数据库开发者 : 海量数据 已为您备好一封通往数智时代的邀请函,请您于 5月26日 前往北京昆泰嘉瑞文化中心,赶赴 openGauss Developer Day 2023 的盛大约定。 本次专场活动中,海量数据将会轮番为您展示最核心的技术…

chatgpt赋能python:Python二次方的表示方法及其应用

Python 二次方的表示方法及其应用 介绍 Python是一种优雅、简洁、易学的编程语言,很多程序员选择使用Python开发各种应用。在计算机科学中,二次方(也称为平方)非常常见。在Python中,我们有多种方法来表示二次方。 平…

C Primer Plus第六章编程练习答案

学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出! 1.编写一个程序,创建一个包…

中小企业如何差异化“生意表达”,成为最了不起的小企业?

​如今的市场已经不是几十年前随便卖一点新鲜的玩意儿就能火爆的场景了。科技发达了,人们的眼界也开阔了,各式各样,琳琅满目的商品占据了市场空间,生意越来越饱满。 竞争趋势激烈,商品同质化现象严重。一些商家企业通过压低价格的…

docker入门(1)----服务/镜像/容器相关命令

安装 官网安装app命令行安装(但是没有图形界面app)brew install docker 架构 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像ubuntu:16.04 就包含了…

深度学习笔记之循环神经网络(七)反向传播角度观察LSTM

深度学习笔记之循环神经网络——反向传播角度观察LSTM 引言回顾加补充:通过时间反向传播 LSTM \text{LSTM} LSTM的反向传播过程场景构建示例:求解梯度 L ( T ) ∂ W X ⇒ F \begin{aligned}\frac{\mathcal L^{(\mathcal T)}}{\partial \mathcal W_{\math…

2023年第十五届B题电工杯初步解题思路

第十五届“中国电机工程学会杯”全国大学生 电工数学建模竞赛题目 B题 人工智能对大学生学习影响的评价 人工智能简称AI,最初由麦卡锡、明斯基等科学家于1956年在美国达特茅斯学院开会研讨时提出。 2016年,人工智能AlphaGo 4:1战胜韩国围棋高手李世石…

javaWeb 兼职管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh兼职管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…

服务器被勒索病毒攻击怎么办,如何进行勒索病毒解密与预防工作?

在当今社会中服务器已经成为企业关键数据存储和传输的重要载体,同样也成为黑客攻击和勒索病毒的首要目标。一旦服务器被勒索病毒攻击,企业的正常运转与经济利益和核心数据都将受到威胁。下面将为大家介绍一下服务器被勒索病毒攻击后应该采取怎样的措施及…

【1091. 二进制矩阵中的最短路径】

来源:力扣(LeetCode) 描述: 给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。 二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即&…

【参考设计】16芯串联电池包储能系统

电池包的应用与技术问题 为了获得更大的能量密度,锂离子和磷酸铁锂电池在电池包中的使用越来越多,比如:电信机房的UPS单元,移动式电站,储能系统等。 锂离子和磷酸铁锂电池在提供更高的功率和能量密度的同时也需要更准…

Android深入源码分析事件分发机制流程

前言 对于Android中的触摸事件即指手指触摸到屏幕时产生的点击事件; 类型如下: MotionEvent.ACTION_DOWNMotionEvent.ACTION_UPMotionEvent.ACTION_MOVEMotionEvent.ACTION_CANCEL Android事件处理流程 主要涉及三个流程:事件采集、事件中…

电子水尺的应用

品概述 本产品是一种采用微处理器芯片为控制器,内置通讯电路的数字式水位传感器,具备高的可靠性及抗干扰性能。适用于江、河、湖、水库及蓄水池、水渠等处的水位测量使用。 本产品使用不锈钢材料做壳体防护材料,内部用高性能的密封材料进行处…

11省政企单位密集调研实在智能数字员工

当前,数字中国建设迎来前所未有的发展机遇。五月,“数字中国”建设持续如火如荼,实在智能又迎来了新的“考察团路线”:西部新宁甘云中轴线晋豫鄂湘东部鲁苏闽,来自11省,20余个“数字化改革政企考察团”&…

【OS】Python模拟简单的操作系统

【OS】Python模拟简单的操作系统 Background 学习操作系统的时候,关注的对象是: 应用程序系统调用操作系统的内部实现 通常的学习思路: 真实的操作系统编译内核环境qemu模拟 但是,换个角度想一下,把上述的思路抽…

智能蓝牙防丢器

蓝牙防丢器,是采用蓝牙技术专门为智能手机设计的防丢器。其工作原理主要是通过距离变化来判断物品是否还控制在你的安全范围。主要适用于手机、钱包、钥匙、行李等贵重物品的防丢,也可用于防止儿童或宠物的走失。防丢器的原理是在手机和蓝牙之间建立连接…

Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...

干货!文章有点长,建议先收藏 目录索引 引言一、性能怪兽-Nginx概念深入浅出二、Nginx环境搭建三、Nginx反向代理-负载均衡四、Nginx动静分离五、Nginx资源压缩六、Nginx缓冲区七、Nginx缓存机制八、Nginx实现IP黑白名单九、Nginx跨域配置十、Nginx防盗链…