zoukankan      html  css  js  c++  java
  • 一次线上mysql死锁分析

    一、现象

    发运车次调用发车接口时发生异常,后台抛出数据库死锁日志。

     

    二、原因分析

     

    通过日志可以看出事务T1等待 heap no 8的行锁 (X locks 锁)

                    T2持有heap no 8的行锁,等待heap no 7的行锁

    两个更新运单sql发生死锁。

    三、代码追踪

    发车接口:/ltl/loadShiftOrg/send

    更新运单状态通过循环遍历进行操作,比较耗时。

     

     

    其他接口更新运单导致发生死锁

    在发车接口之前还调用了另外一个接口

    /ltl/loadShift/saveOrUpdateShift

    该接口中有个批量装车的操作:

     

     

    该接口中进行了运单更新。

     

    四、解决方案

    1>设置mysql 锁超时参数 innodb_lock_wait_timeout 现在默认50(s)

    2>优化代码批量更新运单状态:

    3>前端调用/saveOrUpdateShift后等待返回结果之后再调用/send接口

    五、经验

    1. 数据库的批量操作尽量通过sql来执行。
    2. Mysql部分参数进行调优。

      

  • 相关阅读:
    4.8日学习
    Apache安装
    HTML5 review
    个人阅读作业LAST
    个人阅读作业Week7
    结对编程:界面模块总结
    个人博客作业Week3
    结对编程博客
    个人博客week2
    软工第一次作业简单总结
  • 原文地址:https://www.cnblogs.com/upupgo/p/9683828.html
Copyright © 2011-2022 走看看