1. 程式人生 > >併發請求 + 事務巢狀 + 更新資料 = 死鎖

併發請求 + 事務巢狀 + 更新資料 = 死鎖

今有幸為同事排查死鎖問題。

問題描述:一個get介面,內依據引數執行select ... for update,未考慮併發場景,導致程式死鎖,且只要併發請求該介面,幾乎百發百中。

問題定位

  1.檢測資料庫死鎖情況,結果無。

  2.介面內無相關共享資源,不會死鎖

  3.由於從事許久事務方面工作,所以想到了事務傳播機制,果不出所料,其配置檔案中get*介面配置的傳播機制是SUPPORTS,故判斷應該是事務巢狀死鎖。

問題解釋:A請求開啟新事物執行update,此時來了B請求update,由於是SUPPORTS,所以加入A事務,A事務中語句執行完畢但事務需等待B完成後才能提交,而B中語句需等待A中提交後才能執行,所以出現了併發請求 

事務巢狀 資料庫更新導致死鎖問題。

可參考下圖: