一、現象 發運車次調用發車介面時發生異常,後臺拋出資料庫死鎖日誌。 二、原因分析 通過日誌可以看出事務T1等待 heap no 8的行鎖 (X locks 排他鎖) 事務T2持有heap no 8的行鎖,等待heap no 7的行鎖 兩個更新運單sql發生死鎖。 三、代碼追蹤 發車介面:/ltl/l ...
一、現象
發運車次調用發車介面時發生異常,後臺拋出資料庫死鎖日誌。
二、原因分析
通過日誌可以看出事務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介面
五、經驗
- 資料庫的批量操作儘量通過sql來執行。
- Mysql部分參數進行調優。