• 0
  • 0
分享
  • MySQL性能测试及调优中的死锁处理方法——软件测试圈
  • 曼倩诙谐 2021-06-25 10:03:07 字数 1297 阅读 1480 收藏 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软件测试网原创

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 摘要:多年的数字对讲机测试经验总结出一种“总分总”软件测试法(又称三步测试法),该测试方法基于传统软件测试过程V模型的右方集成测试、系统测试、验收测试阶段,结合现代软件测试过程,综合运用黑盒测试法、灰盒测试法、冒烟测试法、回归测试法、探索性测试法,并进一步尝试发散性思维测试。关键词:数字对讲机;软件测试;总分总测试法;三步测试法;BUG抓取自从工信部2009年666号文件《工业和信息化部关于150MHz 400MHz频段专用对讲机频率规划和使用管理有关事宜的通知》颁布拉开了对讲机模转数的序幕,国内企业经过几年的模转数的技术积累和产业结构调整,已有能力批量生产制造数字对讲机。随着微电子技术的发展...
            0 0 1770
            分享
          •   1. 首先明确下并发的概念。在性能测试中并发可以理解为同一时刻做不同的事,或同一时刻做同样的事。一般我们在性能测试的时候也是这么去模拟的。那这个同一时刻的并发是很难做到的。  要知道我们用来发起压力的测试工具本身要能做到同一时刻发起压力,如果设置线程数过多,负载机本身资源不足会有排队,请求建立和服务端的连接过程会排队,请求数据发送到服务的时候在网络队列上也会排队,请求数据达到服务端,在服务端也会进行排队,所以严格意义上的并发多少用户数等等是比较难做到的。  但是,并发我们可以分层去看,像一般的webserver或容器服务都有监控数据,如nginx的Active connections,to...
            0 0 2458
            分享
          • 1.软件的生命周期      软件生命周期(SDLC, Systems Development Life Cycle)是软件开始研制到最终被废弃不用 所经历的各 个阶段。— 软件开发模型      在周期内,我们无论是开发还是测试都依赖于某个模型进行作为依据,有效地提高开发、测试效率。2.软件开发模型      在软件开发的实践中,人们总结了很多软件的开发模型来描述和表示一个复杂的开发过程,如果瀑布模 型、快速原型模型、螺旋模型等。     &n...
            14 14 1751
            分享
          •   Twitter公司的前身 Twitter 正准备对其算法进行一次"重大更新"。马斯克说,目前该应用的"For You"推送会显示来自其更广泛网络的热门和趋势帖子,以及你关注的人的精彩内容,而新算法将显示来自相对影响力不那么大的一般账户的帖子。  他指出,这些帖子和账户将包括用户"好友和关注"网络之外的账户,这意味着这一变化将试图让用户接触到他们可能觉得有趣但尚未发现的新账户。这也将使小型创作者有机会被更多人发现,这也符合马斯克将 X 打造成一个创作者平台的计划。  在过去的几个月里,X 平台针对创作者推出了一些功能,比如支持长篇文...
            0 0 324
            分享
          • 读者提问:成为软件测试,需要具备一定的逻辑思维能力吗 ?阿常回答:肯定要啊。周二一位读者朋友小明问阿常这个问题:小明测试零基础、想要转行做测试,他认为测试很简单,不需要敲代码,不需要理解业务逻辑。显然,他的理解是有偏差的。小白如何转测试?软件测试可分为两类,业务测试工程师(测试具体的业务需求)和测试开发工程师(研发工具或平台给前者使用)。软件测试工程师的职业规划前者肯定是需要理解业务逻辑的;后者则需要敲代码,并且是基于对业务逻辑的理解上敲代码。所以想要成为一名合格的测试,必须具备一定的逻辑思维能力。测试逻辑思维能力的应用测试人员的逻辑思维能力主要运用在以下三方面:需求分析与评审测试方案设计与评...
            0 0 1047
            分享
      • 51testing软件测试圈微信