mysql中的共享锁,排他锁,间隙锁,意向锁及死锁机制

news2024/11/25 9:44:12

一、前言(以下均为读完 高性能Mysql第四版 后的个人理解,建议阅读,挺不错的)

在写锁机制前先简单贴出mysql InnoDB引擎中的事务特性与隔离级别:

  1. 事务的ACID标准

(1)原子性-atomicity:一个事务作为一个不可分割的工作单元,要么全部执行提交成功,要么全部执行失败回滚。

(2)一致性-consistency:数据库总是从一个一致性状态转换到下一个一致性状态,如若一个事务没有被提交成功,那么该事务所作的所有修改都不会保存到数据库中。

(3)隔离性-isolation:一个事务在最终提交之前,其所作的修改对其他事务是不可见的。

(4)持久性-durability:一个事务一旦提交,其所做的修改将永久保存到数据库,即使系统奔溃,数据也不会丢失。

  1. 隔离级别

(1)READ UNCOMMITTED-读未提交:该隔离级别,事务中可以读取到其他事务未提交的修改,可能产生脏读。

(2)READ COMMITTED-读已提交:该隔离级别,事务只能读取到其他事务提交后的修改,属于不可重复读,可能产生在同一事务中同一条查询语句产生两种不同的结果,且可能产生幻读。

(3)READ COMMITTED-可重复读(InnoDB默认隔离级别):该隔离级别解决了 读已提交 隔离级别的不可重复读问题,保证在同一个事务中多次读取相同行数据的结果是一样的,但可能产生幻读。

(4)SERIALIZABLE-可串行化:强制事务按顺序执行,解决事务之间的冲突,属于加锁读。

二、共享锁与排他锁

1.共享锁,简称S锁,也称读锁,多事务可共享一把锁,可读不可写(实践证明先获得共享锁的事务可修改数据,后续其他事务不可修改)。

申请行级共享锁示例:select id from table1 where id = 1 lock in share mode

2.排他锁,简称X锁,也称写锁,排他锁不可与其他锁共存,包括共享锁和排他锁,如事务1获取到某记录的排他锁且未释放时,那么其他事务在获取该记录的共享锁和排他锁时将被阻塞。

申请行级排他锁示例:select id from table1 where id = 1 for update

updat delete insert语句均会自动申请排他锁

3.普通select语句会不会申请共享锁或排他锁?

不会,普通select语句属于快照读,没有任何锁机制。

三、间隙锁

上面说过,在InnoDB默认隔离级别可重复读级别下,会产生幻读问题,实际上InnoDB默认使用了间隙锁策略来防止幻读产生。

什么是幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行,此时就会产生幻读。

简介:

(1)行锁:锁直接加在索引记录上面,锁住的是key。

(2)间隙锁:锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为可重复读或以上级别。

(3)行锁和间隙锁组合起来叫Next-Key Lock。

默认情况下,InnoDB工作在可重复读隔离级别下,并且会以Next-Key Lock的方式对数据行进行加锁,这样可以有效防止幻读的发生。Next-Key Lock是行锁和间隙锁的组合,当InnoDB扫描索引记录的时候,会对索引记录加上行锁,再对索引记录两边的间隙加上间隙锁。加上间隙锁之后,其他事务就不能在这个间隙修改或者插入记录。

间隙锁在InnoDB的作用就是防止其他事务的插入操作,以此防止幻读的发生。

(4)间隙锁产生条件:

当使用范围条件去检索唯一索引列,未加索引列,非唯一索引列,并申请共享/排他锁时,会申请间隙锁。

当使用等值条件去检索未加索引列,非唯一索引列,并申请共享/排他锁时,会申请间隙锁。

注意:若检索条件未加索引,sql可能会走聚簇索引的全表扫描进行过滤,这时表中每条记录都会加上排他锁,但是对于不满足条件的记录会在加锁后立马释放锁,最终持有锁的是满足条件的记录。不满足条件的记录会有上锁又释放锁的过程。

四、意向锁

InnoDB支持多粒度锁,表锁和行锁可同时存在,意向锁为表锁中的一种。

1.意向锁分为意向共享锁和意向排他锁:

(1):意向共享锁-事务有意向给表中某行申请共享锁。

(2):意向排他锁-事务有意向给表中某行申请排他锁。

示例:

该事务申请某些行的共享锁之前,必须先申请该表的意向共享锁
select id from table1 where id = 1 lock in share mode
该事务申请某些行的排他锁之前,必须先申请该表的意向排他锁
select id from table1 where id = 1 for update

2.意向锁的互斥性:

(1)首先意向锁是表级锁,不与行级锁互斥,也就是说意向锁不会与行级的共享/排他锁互斥,可以共同存在。

(2)意向共享锁与表级的共享锁互相兼容,可共同存在,但与表级排他锁互斥。

(3)意向排他锁与表级的共享/排他锁均互斥

示例:

事务A申请了id=1的记录的排他锁,并未提交事务,此时表table1存在两把锁,即表table1上的意向排他锁和id=1记录上的行级排他锁
select id from table1 where id = 1 for update
事务B获取表table1的表级共享锁,
LOCK TABLES table1 READ;

此时事务 B 检测事务 A 持有 table1 表的意向排他锁,就可以得知事务 A 必然持有该表中某些数据行的排他锁,那么事务 B 对 table1 表的加锁请求就会被阻塞,而无需去检测表中的每一行数据是否存在排他锁,极大提高效率。

五、死锁

1.死锁是指两个或多个事务相互持有和请求相同资源上的锁,产生了循环依赖。当多个事务试图以不同的顺序锁定资源时会导致死锁。当多个事务锁定相同的资源时,也可能会发生死锁。例如,设想运行下面两个针对主键为(stock_id,date)的StockPrice表的事务:

事务A

事务B

当两个事务同时执行完第一条sql,此时互相持有id=3和id=4的数据行的排他锁,而锁并没有被释放,当执行第二条sql时,双方均永远等待对方释放锁,这就导致死锁的产生。

2.如何解决:

(1):InnoDB实现了死锁检测和锁超时机制,一般来说都能自动检测到,并使一个或多个事务释放锁并回滚,剩下的事务获得锁,继续完成事务。

(2):

查看表是否在使用
show open tables where in_use > 0 
如果查询结果不为空,继续。

查看数据库当前进程,看一下有无正在执行的慢SQL线程
show processlist

当前运行的所有事务
SELECT * FROM information_schema.INNODB_TRX

当前出现的锁
SELECT * FROM information_schema.INNODB_LOCKs

锁等待的对应关系
SELECT * FROM information_schema.INNODB_LOCK_waits

看事务表INNODB_TRX,里面是否有正在锁定的事务线程,看看ID(表INNODB_TRX的trx_mysql_thread_id字段)是否在show processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,需要手动kill掉。

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

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

相关文章

vue中使用富文本Tinymce

本文是直接引用vue-element-admin中的,在此记录方便下次使用,日后再详细注释。 再src下的components下创建Tinymce 下包含以下文件 index.vue是主体文件 plugins.js 是 插件配置 toolbar.js 是 粗体、斜体等配置 EditorImage.vue 是右上角的上传 封装后…

一文速学-GBDT模型算法原理以及实现+Python项目实战

目录 前言 一、GBDT算法概述 1.决策树 2.Boosting 3.梯度提升 使用梯度上升找到最佳参数 二、GBDT算法原理 1.计算原理 2.预测原理 三、实例算法实现 1.模型训练阶段 1)初始化弱学习器 2)对于建立M棵分类回归树​: 四、Python实现 …

Spring_让Spring 依赖注入彻底废掉

在Spring之基于注解方式实例化BeanDefinition(1)_chen_yao_kerr的博客-CSDN博客中,我们在末尾处分享了一个甜点,就是关于实现了BeanDefinitionRegistryPostProcessor也可以实例化bean的操作,首先需要去了解一下那篇博客…

宝塔(二):升级JDK版本

目录 背景 一、下载JDK17 二、配置环境变量 三、配置新的JDK路径 背景 宝塔的软件商店只有JDK8,不满足我当前项目所需的JDK版本,因此想对JDK版本进行升级,升级为JDK17。 一、下载JDK17 先进入 /usr/lib/jvm 目录 点击终端,进…

OpenCV——line、circle、rectangle、ellipse、polylines函数的使用和绘制文本putText函数以及绘制中文的方法。

学习OpenCV的过程中,画图是不可避免的,本篇文章旨在介绍OpenCV中与画图相关的基础函数。 1、画线条——line()函数 介绍: cv2.line(image, start_point, end_point, color, thickness)参数: image: 图像start_point&#xff1a…

拉链表(小记)

拉链表创建外部表将编写的orders.txt上传到hdfs创建一个增减分区表将orders表的数据传入ods_orders_inc查看分区创建历史表插入数据操作创建外部表 create database lalian; use lalian;create external table orders(orderId int,createDate string,modifiedTime string,stat…

Redis集群方案应该怎么做?

今天我们来跟大家唠一唠JAVA核心技术-RedisRedis是一款流行的内存数据库,适用于高性能的数据缓存和实时数据处理。当需要处理大量数据时,可以使用Redis集群来提高性能和可用性。Redis在单节点模式下,虽然可以支持高并发、快速读写、丰富的数据…

sizeof与一维数组和二维数组

🍕博客主页:️自信不孤单 🍬文章专栏:C语言 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏关注 sizeof与一维数组和二维数组 文章目录sizeof与一维数组和二维数组前言1. sizeof与…

专业版即将支持自定义场景测试

物联网 MQTT 测试云服务 XMeter Cloud 专业版于 2022 年底上线后,已有不少用户试用,对数千甚至上万规模的 MQTT 并发连接和消息吞吐场景进行测试。同时我们也收到了希望支持更多物联网协议测试的需求反馈。 新年伊始,XMeter 团队全力聚焦于 …

搭建Gerrit环境Ubuntu

搭建Gerrit环境 1.安装apache sudo apt-get install apache2 注意:To run Gerrit behind an Apache server using mod_proxy, enable the necessary Apache2 modules: 执行:sudo a2enmod proxy_http 执行:sudo a2enmod ssl 使新的配置生效,需要执行如下命令:serv…

ctfshow【菜狗杯】wp

文章目录webweb签到web2 c0me_t0_s1gn我的眼里只有$抽老婆一言既出驷马难追TapTapTapWebshell化零为整无一幸免无一幸免_FIXED传说之下&#xff08;雾&#xff09;算力超群算力升级easyPytHon_P遍地飘零茶歇区小舔田&#xff1f;LSB探姬Is_Not_Obfuscateweb web签到 <?ph…

在社交媒体上行之有效的个人IP趋势

如果您认为无论是获得一份工作、建立一家企业还是推动个人职业发展&#xff0c;社交媒体都是帮助您实现目标的可靠工具&#xff0c;那么个人IP就是推动这一工具前进的燃料。个人IP反映了您是谁&#xff0c;您在所处领域的专业程度&#xff0c;以及您与他人的区别。社交媒体将有…

打破原来软件开发模式的无代码开发平台

前言传统的系统开发是需要大量的时间和成本的&#xff0c;如今无代码开发平台的出现就改变了这种状况。那么你知道什么是无代码开发平台?无代码开发对企业来说有什么特殊的优势么?什么是无代码平台无代码平台指的是&#xff1a;使用者无需懂代码或手写代码&#xff0c;只需通…

代码分享:gprMax钻孔地质雷达波场模拟

代码分享&#xff1a;gprMax钻孔地质雷达波场模拟 前言 gprMax模拟地面地质雷达被广泛使用&#xff0c;但是在钻孔内进行地质雷达的模拟较少。本博文尝试利用gprMax进行钻孔地质雷达的模拟&#xff0c;代码仅供大家借鉴。 文章目录代码分享&#xff1a;gprMax钻孔地质雷达波场…

【数据结构】链表练习题(1)

练习题1.移除链表元素(LeetCode203)2.链表的中间结点(LeetCode876)3.链表的倒数第k个结点(剑指offer)4.反转链表(LeetCode206)5.合并两个有序链表(LeetCode21)6.链表分割(牛客)7.链表的回文结构(牛客)1.移除链表元素(LeetCode203) 给你一个链表的头结点 head 和一个整数 val &…

第十四届蓝桥杯三月真题刷题训练——第 4 天

目录 题目 1 &#xff1a;九数算式_dfs回溯(全排列) 题目描述 运行限制 代码&#xff1a; 题目2&#xff1a;完全平方数 问题描述 输入格式 输出格式 样例输入 1 样例输出 1 样例输入 2 样例输出 2 评测用例规模与约定 运行限制 代码&#xff1a; 题目 1 &am…

数据结构刷题(十九):77组合、216组合总和III

1.组合题目链接过程图&#xff1a;先从集合中取一个数&#xff0c;再依次从剩余数中取k-1个数。思路&#xff1a;回溯算法。使用回溯三部曲进行解题&#xff1a;递归函数的返回值以及参数&#xff1a;n&#xff0c;k&#xff0c;startIndex(记录每次循环集合从哪里开始遍历的位…

场景式消费激发春日经济,这些电商品类迎来消费热潮

春日越临近&#xff0c;商机越浓郁。随着气温渐升&#xff0c;春日经济已经潜伏在大众身边。“春菜”、“春装”、“春游”、“春季养生”等春日场景式消费走热。 下面&#xff0c;鲸参谋为大家盘点几个与春日经济紧密相关的行业。 •春日仪式之春游踏青 ——户外装备全面开花…

查看 WiFi 密码的两种方法

查看 WiFi 密码的两种方法1. 概述2. 在控制面板中查看 WiFi 密码3. 使用 CMD 查看 WiFi 密码结束语1. 概述 突然忘记 WiFi 密码怎么办&#xff1f; 想连上某个使用过的 WiFi&#xff0c;但有不知道 WiFi 密码怎么办&#xff1f; 使用电脑如何查询 WiFi 密码&#xff1f; 以下是…

zabbix4.0 网络发现-自动添加主机-自动注册

zabbix的网络发现 网络发现的好处&#xff1a; 加快zabbix部署 简化管理 无需过多管理就能在快速变化的环境中使用zabbix zabbix网络发现给予以下信息 IP范围 可用的外部服务&#xff08;FTP&#xff0c;SSH&#xff0c;WEB&#xff0c;POP3&#xff0c;IMAP&#xff0c;TCP等&…