1. 程式人生 > >一次線上mysql死鎖分析

一次線上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部分引數進行調優。