• 0
  • 0
分享
  • MySQL性能测试及调优中的死锁处理方法——软件测试圈
  • 曼倩诙谐 2021-06-25 10:03:07 字数 1297 阅读 1122 收藏 0

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

  1、死锁检测

  通过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%'

  2、死锁避免

  当有死锁发生时,通常是由于项目的程序中出现了冗长的事务,或是由于隔离级别设置的不合适等。我们需要在事务使用中注意以下几点:

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

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

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

  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的值,以满足实际的需求。



作者:冯瑶   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • HTTP状态码对照表 HTTP response codes当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。HTTP状态码的英文为HTTP Status Code。 下面是常见的HTTP状态码:200 - 请求成功301 - 资源(网页等)被永久转移到其它URL404 - 请求的资源(网页等)不存在500 - 内部服务器错误HTTP状态码的分类HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTT...
            12 13 1561
            分享
          • HTTP首部字段根据实际用途被分为以下4种类型。1.通用首部通用首部字段(General Header Fields)请求报文和响应报文两方都会使用的首部。Cache-Control:用来声明服务器端缓存控制的指令。包括请求设置指令和响应请求指令。请求控制指令如下。no-cache:不使用缓存实体,要求从 Web 服务器去请求内容。max-age:只接受 Age 值小于 max-age 值的内容,即没有过期的请求对象。max-stale:可以接受过去的对象,但是过期时间必须小于 max-stale 值。min-fresh:接受生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象。...
            0 0 653
            分享
          •   概述  GET请求在URL中传送的参数是有长度限制的,而POST没有。  GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。而POST数据不会显示在URL中。是放在Request body中。  对参数的数据类型,GET只接受ASCII字符,而POST没有限制。  GET请求参数会被完整保留在浏览器历史记录里;相反,POST请求参数也不会被浏览器保留。  GET请求只能进行url编码( application/x-www-form-urlencoded),而POST支持多种编码方式。  GET请求会被浏览器主动缓存,而POST不会,除非手动设置。  GET在浏...
            0 0 768
            分享
          • 前言:消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等,这里准备了一些rabbitmq面试题,你会么?rabbitmq 的使用场景有哪些?1、异步调用2、应用解耦3、流量削峰4、数据冗余5、延迟队列6、分布式事务......rabbitmq 有哪些重要的角色?1、生产者:发送消息的角色。2、消费者:接收并处理消息的角色。3、消息代理者:传递消息的角色,本身不产生和消...
            5 4 1369
            分享
          •   需求  后台  o001 :超级管理员可以建立BBS分论坛  o002:超级管理员可以建立,修改,删除每个BBS分论坛版主信息,包括登录名与密码,每个BBS分论坛可以有一到多个版主;  o003:版主登录后可以修改用户名及密码;  o004:版主查看本分论坛未审批的帖子进行审批或退回.对于其他分论坛信息,本论坛版主权限与普通用户相同。  前台  o005:普通用户注册用户信息,查询密码和用户名;  o006:普通用户登录后可以修改自己的用户信息;  o007:普通用户登录后可以建立,修改,删除自己书写的帖子;  o008:普通用户登录后可以查询,查看别人发表的审核通过的帖子;  o009:...
            1 1 2688
            分享
      • 51testing软件测试圈微信