- @Transactional(rollbackFor = Exception.class)是一種常用的java開發事務注解,最近因為事務失效導致一個線上問題,為此我百度了很多關於這個注解的使用卻沒有發現一個比較使用的,所以在此做一個簡單應用層面的使用解釋。
- @Transactional(rollbackFor = Exception.class)主要核心是基於AOP實現的,運用了動態代理的設計模式,控制了事務的提交,我們在開發過程中知道一個沒有事務的方法調用一個有事務的方法會導致事務失效,但是我們在開發過程中一般都是添加在server層,controller層調用server層進而實現業務邏輯但是controller層是沒有注解的但是我們的代碼還是有事務的,這是因為動態代理模式對接口實現了事務,如果我們在一個controller層調用多個方法極可能會出現事務失效的問題,盡量不要在controller層做業務處理,都放在server層處理,在業務層添加事務。
- 代碼中如果有try{}catch 一定要有意識觀察事務是否失效,盡量把try 給縮小范圍,如果沒有辦法縮小在try中有多個數據庫增刪改操作,一定要在catch中拋出異常,這樣就會回滾(這次我就是這個問題),我只是return了一個錯誤碼 導致事務失效,其實事務失效就是每一個原子化操作沒有得到統一的處理,所以在排查的時候就看看有幾個原子操作,如果多個就記得拋出異常,如果一個可以拋出也可以捕獲。
- 開發過程中由於業務的復雜建議讀者多去封裝,盡量將方法做成共用的方法,在業務的主線路上都是方法調用,實現都是在小方法中,具體的好處我就不多說了,事務就在這個主方法上添加,每個小方法就不要添加了。
