Mysql高级——锁
锁
mysql锁的分类
- 从性能上分为:乐观锁、悲观锁
- 从锁的粒度上分:行锁、间隙锁、页锁、悲观锁
- 从对数据库的操作分类:读锁、写锁
乐观锁需要我们自己通过version字段来实现,如果更新失败则在代码中进行where重试。而我们常见的读锁和写锁就是悲观锁。乐观锁适合于读多的场景,悲观锁适合于写多的场景
读锁
共享锁
select * from tableName where id=1 lock in share mode
写锁
排他锁
select * from T where id=1 for update
行锁
InnoDB的行锁不是锁的一行记录,而是针对索引加的锁。如果在更新时 where字句后面的字段没有索引或者是索引失效,那么此时行锁则会升级为表锁,(只有可重复读隔离级别才会进行锁升级,RC隔离级别不会)
在InnoDB存储引擎中,读未提交、读已提交、可重复读隔离界别下进行查询操作是不会加读锁的,进行更新操作时会加写锁,如果更新的数据存在则是加行锁,如果更新的数据不存在,则会变为间隙锁,锁住一个区间。如果更新的字段没有索引则会从行锁/间隙锁升级为表锁(RR隔离级别下才会升级)。在串行化隔离界别下查询操作会加读锁,更新操作会加写锁。
而MyISAM存储引擎,进行读操作时会加读锁,进行更新操作时会加写锁,这里都是表锁
为什么在可重复读隔离界别下可能会出现行锁升级为表锁?
这是因为它需要满足可重复读和解决幻读问题,进行更新操作时会去扫描聚集索引,为了避免其他事务更改已经扫描过后的数据 进而造成不可重复读和幻读问题的出现,才会去进行表锁。这里也不是真正意义上的加一个表锁,因为此时可能会有其他行被其他事务锁住,它实际上是为每条数据和各个间隙加锁
间隙锁
锁的是一个区间,(n,m),它只有在可重复读隔离界别下才有间隙锁,因为它是来避免幻读问题的。
在更新时如果要更新的数据不存在,此时则会创建间隙锁吗,锁住当前这个区间。
Next-key 锁
是行锁+间隙锁,锁的区间是(n,m]
页锁
页锁只有在BDB存储引擎下才会存在,了解即可
表锁
相比较于行锁而言,表锁的加锁粒度更大,加锁开销更小,锁冲突可能性更高
意向锁
它的目的是提高加表锁的效率,当我们加行锁时,就会为这张表加一个意向锁,其实就是在表上有一个字段标识位。
如果某条数据被某个事务加了行锁,此时其他事务是不能加表锁的,会有锁冲突
当如果需要加表锁时,就不需要去一行一行去遍历数据行 检查此时有没有加行锁,而是直接检查这个标识位就可以确定当前能不能加表锁。
意向锁也分为意向读锁、意向写锁
锁等待分析
通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况
show status like 'innodb_row_lock%';
对各个状态量的说明如下:
- Innodb_row_lock_current_waits: 当前正在等待锁定的数量
- Innodb_row_lock_time: 从系统启动到现在锁定总时间长度
- Innodb_row_lock_time_avg: 每次等待所花平均时间
- Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花时间
- Innodb_row_lock_waits: 系统启动后到现在总共等待的次数
对于这5个状态变量,比较重要的主要是:
- Innodb_row_lock_time_avg (等待平均时长)
- Innodb_row_lock_waits (等待总次数)
- Innodb_row_lock_time(等待总时长)
尤其是当等待次数很高,而且每次等待时长也不小的时候,我们就需要分析系统中为什么会有如此多的等待,然后根据分析结果着手制定优化计划。
查看INFORMATION_SCHEMA系统库锁相关数据表
-- 查看事务
select * from INFORMATION_SCHEMA.INNODB_TRX;
-- 查看锁,8.0之后需要换成这张表performance_schema.data_locks
select * from INFORMATION_SCHEMA.INNODB_LOCKS;
-- 查看锁等待,8.0之后需要换成这张表performance_schema.data_lock_waits
select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS; -- 释放锁,trx_mysql_thread_id可以从INNODB_TRX表里查看到
kill trx_mysql_thread_id-- 查看锁等待详细信息
show engine innodb status;
死锁问题分析
-- 先修改数据库隔离界别
set tx_isolation='repeatable-read';
-- 接下来就会造成死锁,当然是需要begin各自开启一个事务再开始执行下面的语句
Session_1执行:select * from account where id=1 for update;
Session_2执行:select * from account where id=2 for update;
Session_1执行:select * from account where id=2 for update;
Session_2执行:select * from account where id=1 for update;
-- 查看近期死锁日志信息
show engine innodb status;
大多数情况mysql可以自动检测死锁并回滚产生死锁的那个事务,但是有些情况mysql没法自动检测死锁,这种情况我们可以通过日志分析找到对应事务线程id,可以通过kill杀掉。
锁优化实践
- 让数据检索走索引,避免无索引导致行锁升级为表锁的情况
- 尽可能减少范围查询,避免间隙锁
- 尽量控制事务大小,控制锁定资源量与时长,涉及到事务加锁的sql操作尽量放在事务后面执行
- 为了提高效率尽可能使用低事务隔离级别
相关文章:
Mysql高级——锁
锁 mysql锁的分类 从性能上分为:乐观锁、悲观锁从锁的粒度上分:行锁、间隙锁、页锁、悲观锁从对数据库的操作分类:读锁、写锁 乐观锁需要我们自己通过version字段来实现,如果更新失败则在代码中进行where重试。而我们常见的读锁…...
Spring的Async注解线程池扩展方案
目录- [Spring的Async注解线程池扩展方案]- [目录]- [1. 扩展目的]- [2. 扩展实现]- [2.1 扩展Async注解的执行拦截器AnnotationAsyncExecutionInterceptor]- [2.2 扩展Async注解的Spring代理顾问AsyncAnnotationAdvisor]- [2.3 扩展Async注解的 Spring Bean 后置处理器AsyncAn…...
wfb-ng 锁定WiFi接口
wfb-ng 锁定WiFi接口1. 源由2. 需求3. 分析4. 步骤4.1 确认网卡MAC地址4.2 修改udev配置文件4.3 配置重载&重启4.4 确认逻辑网卡接口4.6 修改wfb-ng逻辑WiFi通信接口5. 参考资料6. 补充资料为了更加方便的调试和使用wfb-ng软件,解决由于设备枚举发现时命名可能存…...
Python所有方向的入门和进阶路线,20年老师傅告诉你方法
干了20多年程序员,对于Python研究一直没停过,这几天把我自己对Python的认知和经验,再结合很多招聘网站上的技术要求,整理出了Python所有方向的学习路线图,基本上各个方向应该学什么,都在上面了,…...
RLOAM/RO-LOAM
LOAM框架 LOAM框架包含三个步骤: Scan registration:从原始激光扫描点数据中提取点特征。点特征是角点或者面点。 odometry estimation:在特征提取之后,特征点传递到里程计模块,通过特征匹配和优化步骤计算相对坐标变…...
JUC并发编程之Semaphore-应用与深度源码剖析
目录 JUC并发编程之Semaphore-应用与深度源码剖析 1. Semaphore 是什么? 2.怎么使用Semaphore? 2.1构造方法 2.2 重要方法 2.3 基本使用 需求场景 基础版代码实现 tryAcquire()引入代码实现 acquireUninterruptibly(),acquire()对比代码实现 3.…...
JWT详细介绍使用
一、JWT介绍 JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务…...
C/C++开发,无可避免的多线程(篇六).线程池封装类
一、线程池概念 线程池是一种多线程处理方式,它包含一个线程工作队列和一个任务队列。当有任务需要处理时,线程池会从线程工作队列中取出一个空闲线程来处理任务,如果线程工作队列中没有空闲线程,则任务会被放入任务队列中等待处理…...
HIVE中如何实现针对IPv6 CIDR的查询
Hive默认情况下不支持IPv6 CIDR查询,因为IPv6 CIDR查询需要使用一些额外的函数。 但是可以通过使用UDF(用户自定义函数)来实现这一点。 IPv6 CIDR表示为网络地址/前缀长度,其中网络地址是一个IPv6地址,前缀长度是一个介于0和128之间的整数,表示网络地址中前多少位是网络…...
【微信小程序】-- 生命周期(二十八)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
Kafka 概述
Kafka 概述Broker消费者Kafka 属于分布式的消息引擎系统,主要功能 :提供一套完备的消息发布与订阅解决方案 生产者和消费者都是客户端(Clients): 生产者(Producer):向主题发布消息…...
详解Java8中如何通过方法引用获取属性名/::的使用
在我们开发过程中常常有一个需求,就是要知道实体类中Getter方法对应的属性名称(Field Name),例如实体类属性到数据库字段的映射,我们常常是硬编码指定 属性名,这种硬编码有两个缺点。 1、编码效率低&#x…...
0106广度优先搜索和最短路径-无向图-数据结构和算法(Java)
1 单点最短路径 单点最短路径。 给定一幅图和一个起点s,回答“从s到给定目的顶点v是否存在一条路径?如果有,找出其中最短的那条(所含边数最少)。“等类似问题。 深度优先搜索在这个问题上没有什么作为,因为…...
僵尸(Zombie)进程
文章目录1.僵尸进程2.产生僵尸进程的原因3.利用 wait 函数销毁僵尸进程4.使用 waitpid 函数销毁僵尸进程1.僵尸进程 进程完成工作后(执行完 main 函数中的程序后)应被销毁,但有时这些进程将变成僵尸进程,占用系统中的重要资源。这…...
JS实现:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 数列是 1,1,2,3,5,8,13,21....观察可以看出来从第三个数字开始…...
Verilog如何编写一个基础的Testbench
本文将讲述如何使用Verilog 编写一个基础的测试脚本(testbench)。在考虑一些关键概念之前,先来看看testbench的架构是什么样的。架构包括建模时间、initial块(initial block)和任务(task)。此文…...
基于JavaEE社区物业管理系统开发与实现(附源码资料)
文章目录1. 适用人群2. 你将收获3.项目简介4.技术栈5.测试账号6.部分功能模块展示6.1.管理员6.2.业主1. 适用人群 本课程主要是针对计算机专业相关正在做毕业设计或者是需要实战项目的Java开发学习者。 2. 你将收获 提供:项目源码、项目文档、数据库脚本、软件工…...
问一下ChatGPT:DIKW金字塔模型
经常看到这张DIKW金字塔模型图,还看到感觉有点过份解读的图,后面又加上了insight,impact等内容。 Data:是数据,零散的、无规则的呈现到人们眼前,如果你只看到这些数字,如果没有强大的知识背景&a…...
javaScript基础面试题 ---闭包
闭包1、闭包是什么?2、闭包可以解决什么问题?3、闭包的缺点1、闭包是什么? 闭包是一个函数加上到创建这个函数的作用域的链接,就是一个作用域可以访问到另一个作用域的变量,闭包‘关闭’了函数的自由变量 function f…...
如何自定义您的网站实时聊天图标
实时聊天图标是您网站上的一个按钮,可在访问者单击时打开实时聊天。它代表了您的企业与客户沟通的门户。这是您的网站访问者与您联系、提出问题和接收个性化推荐的一种方式,聊天图标的设计最好是简单且引人入胜,个性化的图标往往更能提现企业…...
ChatTTS一键启动:从零搭建语音合成服务的实战指南
语音合成服务在现代应用中扮演着越来越重要的角色。它被广泛应用于智能客服、有声读物生成和视频内容配音等场景。通过将文本转化为自然流畅的语音,极大地提升了人机交互的体验和应用的可访问性。 然而,对于希望快速部署ChatTTS这类先进语音合成模型的开…...
Flux.1-Dev深海幻境风格探索:卷积神经网络特征可视化艺术再创作
Flux.1-Dev深海幻境风格探索:卷积神经网络特征可视化艺术再创作 最近在玩一个特别有意思的跨界项目,把两个看似不搭界的东西——深度学习的“大脑”和AI艺术生成——给揉到了一起。我们都知道,卷积神经网络(CNN)在识别…...
笔记工具模板系统实用指南:从效率提升到知识管理进阶
笔记工具模板系统实用指南:从效率提升到知识管理进阶 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/gh_mirrors/ob/…...
ChatTTS合成速度优化实战:从音频流处理到并行计算
最近在项目中用到了ChatTTS进行语音合成,效果确实不错,但遇到一个很实际的问题:合成速度太慢,尤其是处理长文本时,等待时间让人有点抓狂。于是花了一些时间研究优化方案,把整个探索过程和最终落地的方案记录…...
2026论文写作工具红黑榜:AI论文工具怎么选?用数据说话!
2026年论文写作工具红黑榜出炉,千笔AI、ThouPen、豆包位列红榜,适配国内学术规范,助力高效科研。黑榜需避开低质免费工具、无真实引用平台及过度依赖全文生成的工具。选择时建议按需求匹配度 - 数据可信度 - 成本承受力三维模型进行评估。 一…...
OpenClaw+百川2-13B办公自动化:会议纪要生成与邮件发送全流程
OpenClaw百川2-13B办公自动化:会议纪要生成与邮件发送全流程 1. 为什么需要自动化会议纪要处理 上周三的部门例会让我彻底崩溃了——2小时的会议录音,手动整理成纪要花了整整3小时。更糟的是,当我终于把邮件发出去时,发现漏掉了…...
采购管理系统:为企业实现降本增效、强化供应链韧性
在数字化浪潮下,采购管理已从传统的成本中心演变为企业的战略职能和价值引擎。选择一款合适的采购管理软件,对于企业实现降本增效、强化供应链韧性、赋能战略决策至关重要。本文将为您盘点市场上主流的五款采购管理软件,深入剖析其核心能力。…...
别再死记硬背了!用ChatGPT/Claude帮你理解AIGC面试题(附Prompt)
用AI对话引擎拆解AIGC面试核心:从死记硬背到深度理解的范式转移 在准备AIGC算法面试时,大多数候选人都会陷入"八股文"的泥潭——机械记忆概念定义却难以理解技术本质。这种学习方式不仅效率低下,更无法应对面试官深入的技术追问。本…...
终极指南:如何使用baidu-wangpan-parse工具免费突破百度网盘限速
终极指南:如何使用baidu-wangpan-parse工具免费突破百度网盘限速 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘直链解析工具baidu-wangpan-parse是专为普…...
从零开始构建高精度原子间势:LLZO材料训练集避坑指南
从零开始构建高精度原子间势:LLZO材料训练集避坑指南 在材料科学的前沿领域,机器学习势函数正掀起一场静默的革命。想象一下,你能够以前所未有的精度模拟材料的原子级行为,同时避免传统量子力学计算的高昂成本——这正是高精度原子…...
