mysql锁分类大全
前言
为什么会出现锁
MySQL中的锁是为了保证并发操作的正确性和一致性而存在的。
当多个用户同时对同一份数据进行操作时,如果不加控制地进行读写操作,就可能导致数据不一致的问题。例如,当多个用户同时对同一行数据进行写操作时,就可能出现数据被覆盖的情况。这时,通过使用锁,可以控制用户对数据的访问,保证同一时间只有一个用户对数据进行修改或者读取操作,从而避免数据的不一致。
模式分类
乐观锁(Optimistic Locking)
是什么
乐观锁并不是锁,而是锁的设计思想。认为对同一数据的并发操作不会总发生,属于小概率事件,不用每次都对数据上锁,而是在更新时检查数据版本(通常是一个版本号或时间戳),如果版本号或时间戳与之前的一致,则认为数据没有被修改,可以更新;如果不一致,则认为数据已经被修改,更新操作失败。这种方式不会阻塞其他访问请求,但是如果冲突频繁发生,则需要重试更新操作,可能会增加系统的复杂度。
优缺点
- 优点:
乐观并发控制没有实际加锁,所以没有额外开销,也不错出现死锁问题,适用于读多写少的并发场景,因为没有额外开销,所以能极大提高数据库的性能。。
- 缺点:
乐观并发控制不适合于写多读少的并发场景下,因为会出现很多的写冲突,导致数据写入要多次等待重试,在这种情况下,其开销实际上是比悲观锁更高的。而且乐观锁的业务逻辑比悲观锁要更为复杂,业务逻辑上要考虑到失败,等待重试的情况,而且也无法避免其他第三方系统对数据库的直接修改的情况。
怎么玩
悲观锁(Pessimistic Locking)
是什么
悲观锁也是一种思想,对数据被其他事务的修改持保守态度,每次更新数据钱都会添加锁,会通过数据库自身的锁机制来实现,从而保证数据操作的排它性。
优缺点
- 优点:
悲观并发控制采取的是保守策略:“先取锁,成功了才访问数据”,这保证了数据获取和修改都是有序进行的,因此适合在写多读少的环境中使用。当然使用悲观锁无法维持非常高的性能,但是在乐观锁也无法提供更好的性能前提下,悲观锁却可以做到保证数据的安全性。
- 缺点:
由于需要加锁,而且可能面临锁冲突甚至死锁的问题,悲观并发控制增加了系统的额外开销,降低了系统的效率,同时也会降低了系统的并行性。
怎么玩
按颗粒度分类
InnoDB | MyISAM | BDB | |
表锁 | true | true | true |
页锁 | false | false | true |
行锁 | true | false | false |
全局锁(Global Lock)
是什么
全局锁就是对整个数据库实例加锁,加锁后的整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
优缺点
- 优点:
-
简单:全局锁是 MySQL 内部实现的一种简单锁机制,可以很容易地使用。
-
稳定:全局锁是最稳定的锁,能够保证操作的一致性和安全性。
-
效率高:当需要执行全局操作时,全局锁是最高效的锁机制。它可以在很短的时间内锁定整个数据库,确保操作的原子性。
-
灵活:MySQL 全局锁还可以用于备份和恢复数据库、进行主从同步等。
-
安全:全局锁可以保证数据的完整性和一致性,防止数据丢失和损坏。
- 缺点:
它会对数据库的并发性能产生很大的影响,并且会导致其他用户的请求被阻塞。因此,在使用全局锁时需要慎重考虑其优缺点,确保操作的安全和效率。
怎么玩
加锁
flush tables with read lock
解锁
unlock tables
表级锁(Table Lock)
是什么
表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL 引擎支持;
优缺点
- 优点:
开销小,加锁快;不会出现死锁;
- 缺点:
锁定粒度大,发出锁冲突的概率最高,并发度最低。
怎么玩
加表读锁或叫共享锁
lock tables t_student read;
加表写锁或叫独占锁
lock tables t_stuent write;
解锁
unlock tables
页级锁(Page Lock)
是什么
锁定表中某些行集合(称做页),被锁定的行只对锁定最初的线程是可行。如果另外一个线程想要向这些行写数据,它必须等到锁被释放。不过其他页的行仍然可以使用。在MySQL5.1之前BDB引擎默认页级锁,之后被弃用。
优缺点
- 优点:
- 提高并发性能:页级锁的粒度比表级锁小,可以让更多的并发事务同时访问不同的数据页,从而提高了并发性能。
- 减少锁冲突:页级锁只锁定需要修改的数据页,减少了锁冲突的可能性,降低了锁等待时间和死锁的风险。
- 提高精度:由于锁的粒度更细,所以事务只需要锁定需要修改的数据页,而不是整个表,这提高了锁的精度,减少了不必要的锁。
- 缺点:
- 内存开销较大:MySQL在使用页级锁时需要维护大量的锁信息,这些信息需要占用内存,如果数据表很大,锁信息的存储可能会占用较多的内存。
- 锁定时间较长:由于页级锁只锁定需要修改的数据页,而不是整个表,因此锁定的时间会相对较长,尤其是在对大量数据进行操作时,这会导致并发性能下降。
- 容易造成页分裂:页级锁需要将表分成若干页,如果频繁对数据进行修改,会导致数据页不断增加,从而容易造成页分裂,进一步增加了内存的占用。
怎么玩
SELECT * FROM table_name WHERE id BETWEEN 1 AND 100 FOR UPDATE;
行级锁(Row Lock)
是什么
基于索引数据结构实现,是 MySQL 中锁定粒度最细的一种锁,只有线程当前使用的行被锁定,其他行对于其他线程都是可用的;InnoDB引擎默认的锁级别。
注意:
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁。
优缺点
- 优点:
发生锁冲突几率低,并发高
- 缺点:
开销大,加锁慢;会出现死锁的情况;
怎么玩
- 记录锁(Record Locks)
几对某条记录加锁
update user set age=10 where id=1
- 间隙锁(Gap Locks)
即对某个范围加锁,但是不包含范围的临界数据
update user set age=10 where id>10 and id<10
- 临键锁(Next-Key Locks)
又记录锁和间隙锁组成,既包含记录本身又包含范围,左开右闭区间
update user set age=10 where id>10 and id<=10
属性分类
共享锁/读锁(Shared Lock/S锁)
是什么
是用于读取数据时使用的一种锁。当一个事务对一个数据对象加上共享锁时,其他事务也可以对该数据对象加上共享锁,但是不能对其加上排它锁。也就是说,其他事务可远观而不可亵玩焉。
优缺点
- 优点:
因为共享锁可以让多个事务在同一时间访问同一资源,所以在读多写少的情况下,共享锁能够提高系统的并发性能和吞吐量。
- 缺点:
- 共享锁对于写操作是阻塞的,即如果一个事务已经持有了共享锁,其他事务就不能获取排它锁,也就不能对该资源进行写操作;
- 共享锁不能保证数据的一致性,即多个事务同时进行读操作时可能读取到的数据是不一致的。
怎么玩
在select语句末尾加上lock in share mode关键字。
# 对id=1的用户加读锁
select * from user where id=1 lock in share mode;
排它锁/写锁(Exclusive Lock/X锁)
是什么
是用于修改数据时使用的一种锁。当一个事务对一个数据对象加上排它锁时,其他事务既不能对该数据对象加上共享锁,也不能对其加上排它锁。也就是说,其他事物不可远观更不可能亵玩焉
优缺点
- 优点:
- 排它锁可以保证在同一时间只有一个事务可以对资源进行写操作,从而避免了数据的不一致性;
- 排它锁在进行写操作时可以保证数据的完整性,从而保证了数据的正确性。
- 缺点:
- 排它锁会阻塞其他事务的读写操作,从而降低了系统的并发性能和吞吐量;
- 如果某个事务持有了排它锁并且出现了死锁,其他事务将无法获取该资源的锁,从而无法进行读写操作。
怎么玩
在select语句末尾加上for update关键字。
# 对id=1的用户加写锁
select * from user where id=1 for update;
小扩展(意向锁)
InnoDB所用的表级锁,其设计目的主要是为了在一个事务中揭示下一步将要被请求的锁的类型。
意向共享锁(IS)
表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁
意向排他锁(IX)
类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。
怎么玩
意向锁是InnoDB自动加的,不需要用户干预。
小结
MySQL的锁没有优劣之分,只有是否更适合当前场景的合适度之说。
在实际应用中,需要根据具体的场景选择适当的锁类型,以达到合理的性能和数据一致性。例如,如果需要高并发的读写操作,可以使用行锁来避免资源竞争和冲突;如果需要修改整张表的结构,可以使用表锁来避免并发问题。此外,还需要注意锁的范围和持续时间,尽可能减少锁的持有时间,以提高并发性能。
相关文章:

mysql锁分类大全
前言 为什么会出现锁 MySQL中的锁是为了保证并发操作的正确性和一致性而存在的。 当多个用户同时对同一份数据进行操作时,如果不加控制地进行读写操作,就可能导致数据不一致的问题。例如,当多个用户同时对同一行数据进行写操作时ÿ…...

推荐几款主流好用的远程终端连接管理软件
一、介绍 远程终端连接管理软件是管理服务器、虚拟机等远程计算机系统不可或缺的工具之一,它可以通过网络连接到另一台计算机,以执行命令、编辑文件或进行其他管理任务,下面我将为大家介绍几款主流好用的远程终端连接管理软件,并…...

描述性统计
参考文献 威廉 M 门登霍尔 《统计学》 文章目录定性数据的描述方法条形图饼图帕累托图定量数据点图茎叶图频数分布直方图MINITAB 工具在威廉《统计学》一书将统计学分为描述统计学和推断统计学,他们的定义分别如下:描述统计学:致力于数据集的…...

第十四届蓝桥杯三月真题刷题训练——第 7 天
目录 第 1 题:三角回文数 问题描述 答案提交 运行限制 代码: 第 2 题:数数 问题描述 答案提交 运行限制 代码: 第 3 题:倍数问题_同余定理_分情况讨论 题目描述 输入描述 输出描述 输入输出样例 运行限…...

剑指 Offer 57. 和为s的两个数字
一、题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 示例 1: 输入:nums [2,7,11,15], target 9 输出:[2,7] 或者 [7…...

PDF转word在线转换方法!操作简单又高效
相信很多已经工作的人都知道,PDF文件格式的优点在于兼容性强、安全性高,而且查看和传输给他人都很方便。但是,这种格式的文件也有不太方便的地方,那就是不能对文件内容进行编辑和修改。对于许多人来说,如果想要编辑修改…...

Jquery项目中使用vue.js
大家在工作的情况中,可能会遇到之前的老项目采用jq书写,或者修改或者新增功能在jq中,原始jq的项目,代码可维护性很差,一个页面几千行jq,可维护性很差,工作量巨大,所以这个时候大家可以引入vue.js。 第一步:引入vue.js…...
蓝桥杯 删除字符
题目描述 给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么? 输入描述 输入的第一行包含一个单词,由大写英文字母组成。 第二行包含一个正整数 t。 其中,单词长度不超过 100,…...
析构函数 对象数组 对象指针
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章 🔥座右铭:“不要等到什么都没有了,才下定决心去做” …...

Vue对Axios网络请求进行封装
一、为什么要对网络请求进行封装? 因为网络请求的使用率实在是太高了,我们有的时候为了程序的一个可维护性,会把同样的东西放在一起,后期找起来会很方便,这就是封装的主要意义。 二、如何进行封装? 1、将…...
Android framework HAL(HIDL)
简述 当你在Android系统中使用不同的硬件设备(例如摄像头、传感器、音频设备等)时,你需要与硬件抽象层(HAL)进行通信。 HAL是一个中间层,它充当了硬件和应用程序之间的桥梁。但是,由于硬件设备…...

QML 模型(ListModel)
LIstModel(列表模型) ListModel 是ListElement定义的简单容器,每个定义都包含数据角色。内容可以在 QML 中动态定义或显式定义。 属性: count模型中数据条目的数量dynamic动态角色,默认情况下,角色的类型…...

你还在调戏AI,有的公司已经用ChatGPT开展业务了
近日,OpenAI 正式宣布开放 ChatGPT 和 Whisper 两个模型的 API,API 版本的ChatGPT 不仅功能更多、性能更强,而且还更便宜一一相当于目前 GPT-3 模型价格打一折!划重点OpenAl正式开放 ChatGPT 和 Whisper 模型的 API,目前 SnapChat…...

DatenLord前沿技术分享 No.20
达坦科技专注于打造新一代开源跨云存储平台DatenLord,致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题,以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。喷泉码具有极高的纠错能力,且具有低延迟、地复…...

基于vivado(语言Verilog)的FPGA学习(1)——了解viviado面板和编译过程
基于vivado(语言Verilog)的FPGA学习(1)——了解程序面板和编译过程 每日废话:最近找实习略微一些焦虑,不想找软件开发,虽然有些C和python基础(之前上课学的),…...

PACS(CT、CR、DR、MR、DSA、RF医院影像管理系统源码)
PACS具体功能介绍: 病人、采集、观片、三维、报告、照相、退出、文件、图像采集、观片操作、三维、测量标注、诊断报告、照相打印、统计报表、系统管理、帮助、病人浏览器、选择数据源、打开图像、病人登记、工作列表、采集、打开画廊。 DICOM查询/获取:…...

Centos7 安装Mysql8.0
1、到指定目录下下载安装包[rootVM-0-14-centos ~]# cd /usr/local/src2、下载mysql8[rootVM-0-14-centos src]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz3、解压mysql8, 通过xz命令解压出tar包, 然后通过t…...
2023年全国最新道路运输从业人员精选真题及答案18
百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 181.某客运企业拥有55辆营运客车,下列关于该企业设置…...

web worker的基本使用案例
文件目录如下 代码按照顺序分别如下 webworker.html <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewpo…...

机器看世界
博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的,…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...