mysql中的共享锁,排他锁,间隙锁,意向锁及死锁机制
一、前言(以下均为读完 高性能Mysql第四版 后的个人理解,建议阅读,挺不错的)
在写锁机制前先简单贴出mysql InnoDB引擎中的事务特性与隔离级别:
事务的ACID标准
(1)原子性-atomicity:一个事务作为一个不可分割的工作单元,要么全部执行提交成功,要么全部执行失败回滚。
(2)一致性-consistency:数据库总是从一个一致性状态转换到下一个一致性状态,如若一个事务没有被提交成功,那么该事务所作的所有修改都不会保存到数据库中。
(3)隔离性-isolation:一个事务在最终提交之前,其所作的修改对其他事务是不可见的。
(4)持久性-durability:一个事务一旦提交,其所做的修改将永久保存到数据库,即使系统奔溃,数据也不会丢失。
隔离级别
(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掉。
相关文章:
mysql中的共享锁,排他锁,间隙锁,意向锁及死锁机制
一、前言(以下均为读完 高性能Mysql第四版 后的个人理解,建议阅读,挺不错的)在写锁机制前先简单贴出mysql InnoDB引擎中的事务特性与隔离级别:事务的ACID标准(1)原子性-atomicity:一个事务作为一个不可分割…...
SpringBoot整合MybatisPlus
文章目录前言一、MybatisPlus是什么?二、使用步骤1.导入依赖2.编写配置文件3.编写Controller和实体类4.编写持久层接口mapper5.启动类加包扫描注解6.测试总结前言 本篇记录一下SpringBoot整合MybatisPlus 一、MybatisPlus是什么? MyBatis-Plusÿ…...
中电金信Gien享汇・大数据专题|金融行业数据架构及模型演进
本期嘉宾 陈子刚 中电金信商业分析事业部华南区总经理 毕业于复旦大学,硕士研究生;拥有16年以上金融行业商业智能领域从业经验;曾就职于中国工商银行、Teradata、东亚银行,服务于平安银行、广发银行、招商银行、广东农信、招商…...
Cadence Allegro 导出Design Cross Section报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Design Cross Section作用3,Design Cross Section示例4,Component Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频 1,概述 <...
【LeetCode】剑指 Offer 23. 链表中环的入口节点 p139 -- Java Version
题目链接:https://leetcode.cn/problems/c32eOV/ 1. 题目介绍(23. 链表中环的入口节点) 给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环&#x…...
LeetCode-96. 不同的二叉搜索树
题目来源 96. 不同的二叉搜索树 递归 1.我们要知道二叉搜索树的性质,对于一个二叉搜索树,其 【左边的节点值 < 中间的节点值 < 右边的节点值】,也就是说,对于一个二叉搜索树,其中序遍历之后形成的数组应该是一…...
JavaWeb基础
Servlet 是在服务器上运行的小程序。这个词是在 Java applet的环境中创造的,Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务。服务器上需要一些程序…...
C++基础了解-03-C++变量类型
C变量类型 一、变量类型 变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。 变量的名称可以由字母、数字和下划线字符组成。…...
树莓派4b——通过mjpg-streamer使用摄像头
参考博文:(51条消息) 树莓派4b如何打开摄像头_树莓派打开摄像头_会飞的小东的博客-CSDN博客(51条消息) 树莓派4B (系统版本11,bullseye)更换清华源_树莓派更换清华源_ASSSSHION的博客-CSDN博客这个坑踩了我一星期,找各…...
MySQL运维篇之读写分离
04、读写分离 4.1、介绍 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。 通过Mycat即可轻易实现上述功能,…...
windows程序最小化到托盘并显示提示信息
windows程序最小化到托盘并显示提示信息背景干货直接上代码解析控制窗口显示初始化托盘添加第一条消息更新界面结束啦背景 有些时候需要程序在最小化的时候可以看到程序进度,甚至需要完全关闭界面,只留下托盘显示,这篇文章就是在这个背景下诞…...
使字符串平衡的最少删除次数(简单动态规划)
给你一个字符串 s ,它仅包含字符 a 和 b 。 你可以删除 s 中任意数目的字符,使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j ,且 s[i] b 的同时 s[j] a,此时认为 s 是 平衡 的。 请你返回使 s 平衡 的 最少 删除次…...
linux网络广播使用
广播使用的特殊的IP地址: 最后一位是255时的IP地址是给广播预留的IP地址, 如:192.168.1.255 UDP服务器在广播数据时,数据报使用的地址不是UDP服务器地址,而是广播地址 如:UDP服务器地址是:192.168.1.110 UDP服务器广播数据时使用地址是:192.168.1.255 UDP数据包发送给交换机…...
Kubernetes源码学习
kubernetes源码剖析 1.下载和编译源码 go 1.18.3 kubernetes 1.24.2 centos 7.9 进入目录$GOPATH/src/k8s.io/kubernetes,执行以下命令即可全量构建,并且构建结果只包含linux平台的: KUBE_BUILD_PLATFORMSlinux/amd64 make all GOFLAGS…...
筑基九层 —— 指针详解
目录 前言: 指针详解 前言: 1.CSDN由于我的排版不怎么好看,我的有道云笔记比较美观,请移步有道云笔记 2.修炼必备 1)入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 -…...
内存清理、动画制作、CPU检测等五款实用软件推荐
人类与99%的动物之间最大差别在于是否会运用工具,借助好的工具,能提升几倍的工作效率。 1.内存清理软件——MemReduct MemReduct是一款内存清理软件,现在越来越多的软件由于硬件的普遍发展,对内存的使用都开始肆无忌惮起来&…...
RocketMQ 5.0 学习笔记
1. 需求 背景:业务需要,平台将使用rocketMQ来实现消息的发送与消费,替代redis的消息功能。 需要在搭建好rocketMQ平台后,进行研究和验证。 技术:Springboot RocketMQ5.0 使用场景:签到活动,…...
796.子矩阵的和
输入一个 n行 m列的整数矩阵,再输入 q个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数 n,m,q。 接下来 n…...
【PySide6】信号(signal)和槽函数(slot),以及事件过滤器
说明 在PYQT中,父控件可以通过两种方式响应子控件的事件: 通过信号(signal)和槽函数(slot)机制连接子控件和父控件父控件可以通过设置eventFilter()方法来监听响应子控件的事件 一、信号(signal)和槽函数(slot) 示例 在PYQT中,每个组件都…...
canal admin管理端配置(二)
下载安装 下载地址: 下载解压即可 配置 修改canal.admin-1.1.5\conf\application.yml server:port: 8089 #端口根据是否冲突修改 spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8spring.datasource:address: 192.0.16.12:3306#数据库ip和端口…...
Servlet 生命周期
Servlet的生命周期有四个阶段:加载并实例化、初始化、请求处理、销毁。主要涉及到的方法有init、service、doGet、doPost、destory等 加载并实例化 Servlet容器负责加载和实例化Servelt。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一…...
redis集群模式登陆
总结redis单机模式时,登陆redis的命令格式: ./redis-cli -h 地址 -p 端口redis集群模式时,登陆redis的命令格式: ./redis-cli -h 地址 -p 端口 -c举例1:redis单机模式下登陆rootubuntu:/usr/local/redis/redis-7.0.0/b…...
04-useMemo 、React.memo、useCallback
useMemo 、React.memo、useCallback 一、useMemo 基本用法 缓存数据,模拟 Vue 中的计算属性。 同样useMemo跟vue中component一样,也是有缓存的,会将结果缓存下来 import React, { useMemo, useState } from react;export default functio…...
windows下安装emqx Unable to load emulator DLL@if ===/ SET data_dir=“
1.报错内容 I:\0-software\02-emqx\emqx-5.0.19-windows-amd64\bin>emqx start Unable to load emulator DLL (I:\0-software\02-emqx\emqx-5.0.19-windows-amd64\erts-12.3.2.9\bin\beam.smp.dll) 此时不应有 SET。 I:\0-software\02-emqx\emqx-5.0.19-windows-amd64\bin&…...
Redis常见问题(未完待续)
Redis常见问题Redis为什么快 ?Redis为什么快 ? 根据官方数据,Redis 的 QPS 可以达到约 100000(每秒请求数); 基于内存 对于磁盘数据库来说,首先要将数据通过 IO 操作读取到内存里再读取&#x…...
2024秋招BAT核心算法 | 详解图论
图论入门与最短路径算法 图的基本概念 由节点和边组成的集合 图的一些概念: ①有向边(有向图),无向边(无向图),权值 ②节点(度),对应无向图,…...
凝聚共识,锚定未来 | 第四届OpenI/O 启智开发者大会NLP大模型论坛成功举办!
2023年2月24日下午,第四届OpenI/O启智开发者大会NLP大模型分论坛在深圳人才研修院隆重举办。该论坛以“开源集智创新探索中文NLP大模型生态发展”为主题,众多业内人士和研发者在此共享NLP领域的前沿动态和研发经验,畅想中国NLP领域的发展前景…...
99.【Git】
Git(一)、什么是版本控制1.什么是版本控制2、常见的版本控制工具(二)、版本控制分类1、本地版本控制2、集中版本控制 SVN3、分布式版本控制 Git(三)、Git与SVN的主要区别1、Git历史(四)、Git下载与环境配置1.git下载2、启动Git(五)、常用的Linux命令1.Linux常用命令(六)、Git必…...
Linux驱动交叉编译把驱动文件放入开发板,以及printk函数打印级别
上一篇介绍了一个最简单的驱动程序和驱动程序大体结构,但那还是用本地编译只能在Ubuntu上运行,我们该怎么编译一个能加载到开发板上呢,就需要交叉编译,交叉编译通常都是在嵌入式开发中使用到的。 交叉编译 理解交叉编译前先了解…...
力扣(LeetCode)433. 最小基因变化(2023.03.07)
基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 ‘A’、‘C’、‘G’ 和 ‘T’ 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 例如,“AACCGGTT”…...
陆丰网站建设/百度收录时间
查看当前在那哪个数据库中 select database()修改 Student 表 AGE属性为 INT类型 可以是NULL ALTER TABLE Student MODIFY COLUMN AGE INT NULL添加一个新列(新字段) ALTER TABLE Student ADD NEWCOLUMN CHAR(10) NULL删除一列 (一个字段&…...
怎么做网页app/武汉seo推广优化
零基础学前端(四)在学习了HTML和CSS相关知识点后,现在开始学习JavaScript。看看用JavaScript是怎么操作HTML元素和CSS样式的。学习JavaScript的起点就是处理网页,所以我们先学习基础语法和如何使用DOM进行简单操作。今儿个学习的内…...
出入西安最新通知今天/快排seo排名软件
根据,我写的一篇文章《让程序产生bug,从而达到自我进化,是否能产生真正的智能生命,与人类沟通》的文章(点击打开链接)。我们在在超级计算机里,进化出智能程序,然后将智能程序转移到机…...
网络营销企业网站设计/宁波pc营销型网站制作
在调用存储过程中,就会涉及到表锁,行锁这一概念:所谓区别:有索引的时候就是行锁,没有索引的时候就是表索。 innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的. 表锁演示(无索引) Sess…...
wordpress取消自动分页/seo点石论坛
Map 接口实现类的特点 Map 与 Collection 并列存在。用于保存具有映射关系的数据:Key-ValueMap 中的 key 和 value 可以是任何引用类型的数据,会封装到 HashMap$Node 对象中Map 中的 key 不允许重复,原因和 HashSet 一样,前面分析…...
qq登陆wordpress/sem是指什么
2019独角兽企业重金招聘Python工程师标准>>> #Golang并发 Golang原生支持并发。并发的最小单位是goroutine,相互之间的通信采用channel. 这里不涉及锁等复杂的内容,先简单的弄个例子了解一下Golang并发实现的简洁。 #例子,实现sli…...