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

      

  • 相关阅读:
    VUE 入门基础(8)
    VUE 入门基础(7)
    VUE 入门基础(6)
    VUE 入门基础(5)
    VUE 入门基础(4)
    VUE 入门基础(3)
    线程的通信
    如何实现一个简单的RPC
    Java程序员必须掌握的线程知识-Callable和Future
    同步函数死锁现象
  • 原文地址:https://www.cnblogs.com/upupgo/p/9683828.html
Copyright © 2011-2022 走看看