一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白?

以下从死锁检测、死锁避免、死锁解决3个方面来探讨如何对MySQL死锁问题进行性能调优。

死锁检测

通过SQL语句查询锁表相关信息:

(1)查询表打开情况

SHOW OPEN TABLES WHERE IN_USE> 0

(2)查询锁情况列表

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS

(3)查询锁等待信息,其中blocking_lock_id是当前事务在等待的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS

(4)查询死锁日志

SHOW ENGINE INNODB STATUS

这条语句只能显示最新的一条死锁,无法完全捕获到系统发生的所有死锁信息。

如果想要记录所有的死锁日志,需要打开innodb_print_all_deadlocks参数,将所有的死锁日志记录到errorlog中。

(5)查询锁等待时间

SHOW STATUS LIKE '%lock%'

死锁避免

当有死锁发生时,通常是由于项目的程序中出现了冗长的事务,或是由于隔离级别设置的不合适等。

我们需要在事务使用中注意以下几点:

(1)尽量保持事务的短小精悍,做出一系列关联的更新操作后立即提交事务,以降低死锁的可能性。特别是不要让有关联的MySQL会话长时间挂起未提交的事务。

(2)建议使用更低的隔离级别,如READ COMMITTED。

(3)在同一事务内修改多张表,或一张表内的不同行时,每次以相同的顺序执行操作。以便让事务形成清晰的锁操作队列而规避死锁。

死锁解决

MySQL数据库通过死锁检测(innodb_deadlock_detect)和死锁超时时间(innodb_lock_wait_timeout)这两个参数来进行死锁解决。

死锁检测(innodb_deadlock_detect):在MySQL 8.0中,增加了一个新的动态变量innodb_deadlock_detect,用来控制InnoDB是否执行死锁检测。

该参数的默认值为ON,即打开死锁检测。开启后InnoDB在加锁的时候会检测加锁后是否会造成死锁,如果会加锁,就回滚代价最小的那一个事务。

死锁超时时间(innodb_lock_wait_timeout):这个参数可以用来处理检测不出来的死锁,或是避免长时间等待较长的事务的情况。

对于高并发的系统,当大量线程等待同一个锁时,死锁检测可能会导致性能的下降。

此时,如果禁用死锁检测,而改为依靠参数innodb_lock_wait_timeout来释放长时间占用锁资源的事务可能会更加高效。

也就是说,在确认死锁检测功能影响了系统的性能并且禁用死锁检测不会带来负面影响时,可以尝试关闭innodb_deadlock_detect选项。

另外,如果禁用了InnoDB死锁检测,需要及时调整参数innodb_lock_wait_timeout的值,以满足实际的需求。

最新文章

  1. EC笔记,第一部分:1.视C++为一个语言联邦
  2. 锋利的jQuery书中推荐的几款插件
  3. Spring+SpringMVC+MyBatis+Maven 服务端XML配置
  4. python 读取sqlite3 数据库
  5. 程序员遇到Bug时的30个反应
  6. 高性能的JavaScript -- 读书笔记
  7. JavaScript高级---组合模式设计
  8. 判断文件是否存在(exist)
  9. svn status详解
  10. 归并排序Merge Sort
  11. Jvisualvm 添加插件
  12. 解决安装TensorFlow GPU缺少文件的一个比较终极的办法
  13. MySQL执行语句的顺序
  14. Flume的概述和安装部署
  15. Flutter 数据模型创建
  16. android sdk 编译--如何将源代码加入android.jar,以及make原理
  17. 为啥RESTFULL如此重要?
  18. 在Excel中根据某一个单元格的出生日期自动精确计算年龄
  19. COM结构化存储中存储对象或者流对象的命名规则
  20. i.mx6 Android5.1.1 System server

热门文章

  1. uni-app 小程序从零开始的开发流程
  2. php open_basedir绕过
  3. javascript(2)运算符
  4. docker镜像与容器的导出导入
  5. jdbc核心技术-宋红康
  6. 计算机网络 -- TCP/IP
  7. Java on Visual Studio Code的更新 – 2021年8月
  8. php安装imagick扩展
  9. js特效代码-onmouseover/onclick 改变标签(背景)颜色
  10. Java基础系列(23)- 打印九九乘法表