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部分参数进行调优。

      

  • 相关阅读:
    7 文件操作
    初识字典1
    软件工程学习进度
    AAAA
    软件工程期末总结
    【操作系统】实验四 主存空间的分配和回收 截止提交时间:2016.6.17
    约教网站开发(一)
    操作系统实验三
    .Scrum团队成立
    数学精灵改进
  • 原文地址:https://www.cnblogs.com/upupgo/p/9683828.html
Copyright © 2011-2022 走看看