spring的事務邊界是在調用業務方法之前開始的,業務方法執行完畢之後來執行commit or rollback(Spring默認取決於是否拋出runtime異常或unchecked異常)。
如果拋出runtime exception 並在你的業務方法中沒有catch到的話,事務會回滾。
一般不需要在業務方法中catch異常,如果非要catch,在做完你想做的工作後(比如關閉文件等)一定要拋出runtime exception,否則spring會將你的操作commit,這樣就會產生髒數據。所以你的catch代碼是畫蛇添足。
由此可以推知,在spring中如果某個業務方法被一個
try {
//bisiness logic code
} catch(Exception e) {
//handle the exception
整個包裹起來,則這個業務方法也就等於脫離了spring事務的管理,因爲沒有任何異常會從業務方法中拋出!全被捕獲併吞掉,導致spring異常拋出觸發事務回滾策略失效。
因此可以在Action層做try……catch異常的捕捉處理