並發請求 + 事務嵌套 + 更新數據 = 死鎖


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

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

問題定位

  1.檢測數據庫死鎖情況,結果無。

  2.接口內無相關共享資源,不會死鎖

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

問題解釋:A請求開啟新事物執行update,此時來了B請求update,由於是SUPPORTS,所以加入A事務,A事務中語句執行完畢但事務需等待B完成后才能提交,而B中語句需等待A中提交后才能執行,所以出現了並發請求 事務嵌套 數據庫更新導致死鎖問題。

可參考下圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM