MySQL出现锁等待Lock wait timeout exceeded该如何快速解决

2024-08-29 10:12

本文主要是介绍MySQL出现锁等待Lock wait timeout exceeded该如何快速解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、前言

二、锁等待是如何产生的?

三、如何避免锁等待?

四、出现锁等待,如何快速解决?

设置合理的锁等待超时时间

使用DBdoctor及时观测锁等待数据

五、总结


一、前言

在使用MySQL等数据库处理业务时,锁机制是确保数据一致性和完整性的重要手段。然而,锁的使用也可能带来一些问题,比如锁等待问题。当多个事务争夺相同资源时,如果不能立即获取,一个事务会进入等待状态,这就是所谓的『锁等待』

锁等待的存在可能会对业务流程产生显著的负面影响,如何避免和解决这一问题?本文,我们将通过两个简单的例子,来帮助各位小伙伴快速理解锁等待的概念,以及探讨如何避免和解决锁等待问题。

二、锁等待是如何产生的?

锁等待又分为行锁与表锁,下面我们举两个简单例子来描述一下这两种锁等待问题是如何产生的。

场景一:

我们假设某天,张三去图书馆,想要借阅《平凡的世界》这本书,当他去到图书馆后,发现这本书刚刚被李四借阅了,那么张三就必须先等一下,直到该书被归还他才能进行借阅。

-- 事务A
START TRANSACTION;
UPDATE books SET book_owner='李四'  WHERE book_name = '平凡的世界';  --行锁-- 事务B
START TRANSACTION;
SELECT * FROM books WHERE book_name = '平凡的世界' for update;  -- 会进入等待状态

在这个例子中,图书馆就好比是数据库,而图书馆里面的书本就相当于是数据记录。李四跟张三的操作就代表了两个并行的事务A与事务B。

事务A首先获取了某一行的排他锁进行更新操作,而此时事务B尝试读取或更新同一行数据。这时,事务B将会等待事务A释放锁后才能继续进行。这就产生了所谓的行锁(Row Lock)。

场景二:

我们继续用借书来举例。某天该图书馆要进行这样一项操作,把本图书馆里面所有书的借阅押金都进行了调整,在原来价格的基础上增加了1块钱。在图书馆工作人员进行这项操作时,张三等用户发现此时他们无法进行借阅操作。

-- 事务ASTART TRANSACTION;
UPDATE books SET 押金 = 押金 + 1;  --表锁-- 事务B
START TRANSACTION;
SELECT * FROM books WHERE book_name = '平凡的世界' for update;  -- 会进入等待状态

在这个例子中,图书馆的更新押金金额(事务A)的操作时,获取了排他锁。与此同时,用户借阅动作(事务B)尝试读取相同数据,因为事务A还未提交或回滚,导致事务B只能等待。这就产生了表锁(Table Lock)。

三、如何避免锁等待?

  1. 合理设计事务:尽量缩短事务执行时间,避免长时间持有锁。特别是在事务内执行时间较长的操作(如复杂的计算或外部服务调用)时,应尽量将这些操作放在事务外。

  2. 使用合适的锁粒度:选择合适的锁定范围(行级锁、表级锁等),以减少锁冲突的可能性。

  3. 避免不必要的锁定:对于只需要读取数据的操作,尽量使用共享锁而不是排他锁,避免锁冲突。

  4. 规范索引设计:良好的索引设计可以减少表扫描,进而减少锁定的行数,降低锁等待的概率。

四、出现锁等待,如何快速解决?

设置合理的锁等待超时时间

通过设置合理的innodb_lock_wait_timeout参数,可以防止事务长时间等待锁,从而避免死锁。

使用DBdoctor及时观测锁等待数据

DBdoctor锁透视功能,可涵盖锁等待、死锁、长事务、未提交事务四大锁场景;通过环形图和泳道图方式可直观的慢动作回放事务SQL的完整执行过程,并按照事务执行时序高亮标识数据库内核详细加锁和等锁事件,慢动作回放问题现场,快速找到问题源头。使用DBdoctor及时观测锁等待数据,合理优化代码,有效避免锁等待产生。

a.通过【锁透视】→【锁等待】菜单,我们可查看在指定时间范围内,当前实例所有锁等待数据。

b.点击【查看等锁信息】,我们可以看到触发锁等待两个事务详细的泳道图,了解各个事务sql之间的关系,如何触发锁等待。

五、总结

锁等待是数据库并发控制中不可避免的现象,但通过精心设计的事务和优化的锁策略,我们可以显著降低它所带来的影响。面对锁等待问题时,我们应该迅速进行监控和深入分析,识别性能瓶颈并采取相应措施进行优化。这样,我们不仅能提升系统性能,还能增强其稳定性和可靠性。

**************************************************************************************************************

这篇关于MySQL出现锁等待Lock wait timeout exceeded该如何快速解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117562

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作