今有幸為同事排查死鎖問題。
問題描述:一個get接口,內依據參數執行select ... for update,未考慮並發場景,導致程序死鎖,且只要並發請求該接口,幾乎百發百中。
問題定位:
1.檢測數據庫死鎖情況,結果無。
2.接口內無相關共享資源,不會死鎖
3.由於從事許久事務方面工作,所以想到了事務傳播機制,果不出所料,其配置文件中get*接口配置的傳播機制是SUPPORTS,故判斷應該是事務嵌套死鎖。
問題解釋:A請求開啟新事物執行update,此時來了B請求update,由於是SUPPORTS,所以加入A事務,A事務中語句執行完畢但事務需等待B完成后才能提交,而B中語句需等待A中提交后才能執行,所以出現了並發請求 + 事務嵌套 + 數據庫更新導致死鎖問題。
可參考下圖: