一,特性:
1,一般在service里加@Transactional注解,不建議在接口上添加,加了此注解后此類會納入spring事務管理中,每個業務方法執行時,都會開啟一個事務,不過都是按照相同的管理機制。
2,@Transactional注解只能應用到public修飾符上,其它修飾符不起作用,但不報錯。
3,默認情況下此注解會對unchecked異常進行回滾,對checked異常不回滾。
那什么是unchecked,什么是checked呢?
通俗的說,編譯器能檢測到的是checked,檢測不到的就是unchecked。
派生於Error或者RuntimeException(比如空指針,1/0)的異常稱為unchecked異常。
繼承自Exception得異常統稱為checked異常,如IOException、TimeoutException等。
4、只讀事務:
@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
只讀標志只在事務啟動時應用,否則即使配置也會被忽略。
啟動事務會增加線程開銷,數據庫因共享讀取而鎖定(具體跟數據庫類型和事務隔離級別有關)。通常情況下,僅是讀取數據時,不必設置只讀事務而增加額外的系統開銷。
PROPAGATION_REQUIRED:如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY:使用當前的事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。
三,解決注解不回滾問題
1,檢查方法是不是public
2,檢查異常是不是unchecked異常
3,如果是checked異常也想回滾的話,注解上寫明異常類型即可
@Transactional(rollbackFor=Exception.class)