当前位置: 首页 > ds >正文

Mysql死锁排查及优化方案

一、死锁介绍

死锁是指两个或多个事务在执行过程中,因互相等待对方持有的资源而无法继续执行,互相等待的情况。

二、问题排查:

1、查看最近一次的死锁命令

show engine innode status

2、使用performance_schema 下的 data_locks 表查看等待关系

  •         介绍

performance_schema 是 MySQL 数据库中的一个内置的系统数据库,最早从MySQL5.5版本产生,这个数据库主要用于收集和存储与数据库性能相关的统计信息和指标。

使用它可以帮助运维人员对数据库性能监控、调优和故障排查提供依据。

  •         检查当前版本是否支持performance_schema :

可以使用下列两种语句中的任意一种,找到ENGINE那一列名为PERFORMANCE_SCHEMA的,若该行对应的SUPPORT为YES则表明支持

句1:   
SELECT * FROM INFORMATION_SCHEMA.ENGINES;句2:
SHOW ENGINES;

  •         检查是否开启performance_schema :
    • Mysql 5.7的版本之前都是关闭的,需要自动打开
SHOW VARIABLES LIKE 'performance_schema';

若未开启,则找到my.ini / my.cnf (windows是my.ini,CentOs是my.cnf)文件,找到performance_schema 将其改为 ON,并重启Mysql服务

[mysqld]
performance_schema = ON

3、错误日志排查

使用下面的命令,查看错误日志保存地址

show variables like '%log_error%';

二、处理死锁

1、可以把 data_locks 表中所有涉及的连接全部 kill;

2、优化业务侧的写入逻辑。

三、预防死锁

1、 配置参数

  • innodb_deadlock_detect:这个参数默认是开启的(值为1),它允许 InnoDB 存储引擎进行死锁检测。如果设置为0,则关闭死锁检测,但这通常不推荐,因为关闭死锁检测可能导致系统不稳定。
  • innodb_lock_wait_timeout:这个参数定义了 InnoDB 事务在放弃前等待其他事务释放锁的最大时间(以秒为单位)。默认值通常是 50 秒。

  • innodb_rollback_on_timeout:当事务等待锁的时间超过 innodb_lock_wait_timeout 指定的时间时,如果这个参数设置为 1(默认值),InnoDB 会回滚该事务。如果设置为 0,事务将继续等待,直到超时或检测到死锁。

找到my.ini / my.cnf (windows是my.ini,CentOs是my.cnf)文件,修改上述三个配置。在配置之前,先查询一下当前Mysql版本是否支持这些参数。

eg: SHOW VARIABLES LIKE 'innodb_deadlock_detect';

2、 优化查询和事务设计

  • 按相同顺序访问对象:确保所有事务以相同的顺序访问表和行可以减少死锁的机会。

  • 使用索引:确保查询使用索引,这可以减少锁定资源的数量和时间。

  • 最小化持有锁的时间:尽量减少事务执行时间,避免长时间持有锁。

  • 避免大事务:将大事务拆分成多个小事务可以减少锁定资源的时间和范围。

3、 使用乐观锁或悲观锁策略

  • 悲观锁:在事务开始时立即获取所有需要的锁。适用于写操作多、冲突频繁的场景。

  • 乐观锁:在事务提交前不进行锁定,只在提交时检查数据是否被其他事务修改。适用于读多写少的场景。

http://www.xdnf.cn/news/14125.html

相关文章:

  • 黄仁勋在2025年巴黎VivaTech大会上的GTC演讲:AI工厂驱动的工业革命(上)
  • 26考研 | 王道 | 计算机组成原理 | 七、输入输出系统
  • 容器的本质是进程
  • c#和c++区别
  • LLM-大模型原理
  • Agent智能体应用到医疗领域场景有哪些?
  • 缓存击穿,缓存穿透,缓存雪崩的原因和解决方案
  • 【Pandas】pandas DataFrame replace
  • 基于深度学习的智能视频分析系统:技术与实践
  • GO 1.25
  • 计算机网络笔记(四十)——6.3远程终端协议TELNET
  • 【学习笔记】重载和重写的注意事项
  • Java面试题021:一文深入了解微服务之网关Zuul
  • window 显示驱动开发-DirectX VA 2.0 的扩展支持
  • 《Deep Residual Learning for Image Recognition》(深度残差学习在图像识别中的应用)
  • SpringBoot深度解析:从核心原理到最佳实践
  • 用 HTML、CSS 和 JavaScript 实现五子棋人机对战游戏
  • uniapp-vue3-js-vite-pinia-eslint 快速开发模板
  • 初学时间复杂度
  • LSM树与B+树优缺点分析
  • C primer plus (第六版)第七章 编程练习第9题
  • uniapp中vue3 ,uview-plus使用!
  • 阿里云OSS
  • 使用 Higress AI 网关代理 vLLM 推理服务
  • el-tree-select 多选树形下拉框,实现当选中时,根据当前选择的对象,动态生成表单数据。
  • Go并发编程中的内存同步与竞态:从理论到实践
  • 使用Stone 3D免编码快速创建带AI数字人的数字空间
  • Day30 模块和库的导入
  • 安科瑞 ADW600 多回路电力计量模块:安装、通信与使用指南
  • 流编辑器sed