1. 程式人生 > >@Transactional事務幾點注意

@Transactional事務幾點注意

這裡面有幾點需要大家留意:
A. 一個功能是否要事務,必須納入設計、編碼考慮。不能僅僅完成了基本功能就ok。
B. 如果加了事務,必須做好開發環境測試(測試環境也儘量觸發異常、測試回滾),確保事務生效。
C. 以下列了事務使用過程的注意事項,請大家留意。
1.不要在介面上宣告@Transactional ,而要在具體類的方法上使用 @Transactional 註解,否則註解可能無效。
2.不要圖省事,將@Transactional放置在類級的宣告中,放在類宣告,會使得所有方法都有事務。故@Transactional應該放在方法級別,不需要使用事務的方法,就不要放置事務,比如查詢方法。否則對效能是有影響的。

3.使用了@Transactional的方法,對同一個類裡面的方法呼叫, @Transactional無效。比如有一個類Test,它的一個方法A,A再呼叫Test本類的方法B(不管B是否public還是private),但A沒有宣告註解事務,而B有。則外部呼叫A之後,B的事務是不會起作用的。(經常在這裡出錯)
4.使用了@Transactional的方法,只能是public,@Transactional註解的方法都是被外部其他類呼叫才有效,故只能是public。道理和上面的有關聯。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 註解,它也不會報錯,但事務無效。

5.經過在ICORE-CLAIM中測試,效果如下:
A.丟擲受查異常XXXException,事務會回滾。
B.丟擲執行時異常NullPointerException,事務會回滾。
C.Quartz中,execute直接呼叫加了@Transactional方法,可以回滾;間接呼叫,不會回滾。(即上文3點提到的)
D.非同步任務中,execute直接呼叫加了@Transactional方法,可以回滾;間接呼叫,不會回滾。(即上文3點提到的)
E.在action中加上@Transactional,不會回滾。切記不要在action中加上事務。
F.在service中加上@Transactional,如果是action直接調該方法,會回滾,如果是間接調,不會回滾。(即上文3提到的)

G.在service中的private加上@Transactional,事務不會回滾。