關於 Transactional的注意事項

2021-09-26 10:46:22 字數 1124 閱讀 1390

這裡面有幾點需要大家留意:

a. 乙個功能是否要事務,必須納入設計、編碼考慮。不能僅僅完成了基本功能就ok。

b. 如果加了事務,必須做好開發環境測試(測試環境也盡量觸發異常、測試回滾),確保事務生效。

c. 以下列了事務使用過程的注意事項,請大家留意。

不要在介面上宣告@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.丟擲受查異常***exception,事務會回滾。

b.丟擲執行時異常nullpointerexception,事務會回滾。

c.quartz中,execute直接呼叫加了@transactional方法,可以回滾;間接呼叫,不會回滾。(即上文3點提到的)

d.非同步任務中,execute直接呼叫加了@transactional方法,可以回滾;間接呼叫,不會回滾。(即上文3點提到的)

e.在action中加上@transactional,不會回滾。切記不要在action中加上事務。

f.在service中加上@transactional,如果是action直接調該方法,會回滾,如果是間接調,不會回滾。(即上文3提到的)

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

Transactional註解初見

之前一直使用宣告式事務,切面程式設計的配置方式讓程式設計者忘記了事務的存在,一旦離開,發現這個事務還是蠻重要的 public inte ce userservice transactional public class userserviceimpl implements userservice p...

Transactional配置詳解

1 事務的7種屬性 propagation required 支援當前事務,如果當前沒有事務,就新建乙個事務。預設配置,也是常用的選擇。propagation supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。propagation mandatory 支援當前事務,如果當前沒有...

Transactional註解詳解

預設遇到throw new runtimeexception 會回滾 需要捕獲的throw new exception 不會回滾 指定回滾 transactional rollbackfor exception.class public void methodname 指定不回滾 transacti...