1. 程式人生 > >try catch異常丟擲與spring事務回滾策略相關

try catch異常丟擲與spring事務回滾策略相關

將異常捕獲,並且在catch塊中不對事務做顯式提交(或其他應該做的操作如關閉資源等)=生吞掉異常;

spring的事務邊界是在呼叫業務方法之前開始的,業務方法執行完畢之後來執行commit or rollback(Spring預設取決於是否丟擲runtime異常). 
如果丟擲runtime exception 並在你的業務方法中沒有catch到的話,事務會回滾。 
一般不需要在業務方法中catch異常,如果非要catch,在做完你想做的工作後(比如關閉檔案等)一定要丟擲runtime exception,否則spring會將你的操作commit,這樣就會產生髒資料.所以你的catch程式碼是畫蛇添足。

由此可以推知,在spring中如果某個業務方法被一個

     try {   

            //bisiness logic code   

          } catch(Exception e) {   

             //handle the exception   

整個包裹起來,則這個業務方法也就等於脫離了spring事務的管理,因為沒有任何異常會從業務方法中丟擲!全被捕獲併吞掉,導致spring異常丟擲觸發事務回滾策略失效。


不過,如果在catch程式碼塊中採用頁面硬編碼的方式使用spring api對事務做顯式的回滾,這樣寫也未嘗不可。