多線程導致事務失效-記一次性能優化


優化背景:項目中有一個批量更新的方法,由於代碼邏輯是逐個調用數據庫進行更新,導致在更新數量多的情況下,整個方法執行慢。

正常業務情況下,更新的數量能達到500個,假設更新一個耗時為100ms,那么500個需要的時間為50秒,用戶肯定等不了那么久,需要優化。

一開始想法是,開啟多線程去更新,一個線程執行一個sql更新,我便動起手來,發現用多線程效果確實還可以,500個數據庫更新耗時大概3秒。喜笑顏開。

 

然而,后面分析這個改動會帶來的影響是:

原來這是一個事務方法,在使用多線程之后,那么這些批量更新就不在同一個事務了,那么可能存在某個線程中某個執行異常了,但是其他線程中的任務依然提交成功,就達不到事務的效果了。

(事務狀態基於threadlocal來保存,不同線程那么threadlocal則不同)

 

那么如果解決上面遇到的問題呢?

剛開始想到兩個方法:

方法一 : 讓這些線程共用同一個事務,那么則需要自定義一個事務管理器,(這個個人感覺比較麻煩),只是有這個想法,還未去實現。

方法二:讓這500個sql更新操作,變成一個批量更新的sql,減少網絡傳輸的耗時。

 

最終使用了方法二,優化執行效率同時也保證了事務。

 


免責聲明!

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



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