spring事務的迷惑大坑

今天想分享的內容是關於spring事務的。標題雖然說的是spring的大坑,但其實還是使用者的問題。簡述一下問題吧。

 

今天開發有個無法解決的bug,說是同一個功能在local/dev/qa都沒事,上到uat就請求很慢並且會導致其他功能不可用。於是幫忙排查,發現環境一致,只有數據量不一樣。

 

於是排查mysql,發現當接口被調用後。事務表會多出一條記錄,鎖了4張表。又去排查sql執行時間。發現有50秒。很懵逼。。爲什麼一個查詢語句還要加事務??  於是排查了接口代碼。

 

接口方法被@Transactional註解標註,開啓了一個聲明式事務。但是內部邏輯比較複雜,會進行很多多表關聯查詢。這就導致了長事務。所以後續請求使用到這張表被鎖了。無法執行。

 

當我讓開發把聲明式事務改成編程式,並優化了事務執行時間,這個問題就消失了。

 

所以其實spring提供的聲明式事務註解雖然很好用,但是如果使用不當,還是會帶來一些負面影響的。

 

尤其是那些喜歡寫sql的開發人員,對於他們來說就是面向sql編程,經常就是10幾個表的關聯sql。使用聲明式事務就會造成這種一個方法裏全都是複雜、執行緩慢的sql。自然而然導致長事務的發生。

 

所以如果可以還是儘可能優化代碼邏輯,使用編程式事務更穩妥一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章