1. 程式人生 > >Spring中的@Transactional(rollbackFor = Exception.class)屬性詳解

Spring中的@Transactional(rollbackFor = Exception.class)屬性詳解

今天我在寫程式碼的時候,看到了。一個註解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,這個註解的用法;
在這裡插入圖片描述
如下圖所示,我們都知道Exception分為執行時異常RuntimeException和非執行時異常

error是一定會回滾的
在這裡插入圖片描述
如果不對執行時異常進行處理,那麼出現執行時異常之後,要麼是執行緒中止,要麼是主程式終止。
如果不想終止,則必須捕獲所有的執行時異常,決不讓這個處理執行緒退出。佇列裡面出現異常資料了,正常的處理應該是把異常資料捨棄,然後記錄日誌。不應該由於異常資料而影響下面對正常資料的處理。

非執行時異常是RuntimeException以外的異常,型別上都屬於Exception類及其子類。如IOException、SQLException等以及使用者自定義的Exception異常。對於這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行catch並處理,否則程式就不能編譯通過。所以,面對這種異常不管我們是否願意,只能自己去寫一大堆catch塊去處理可能的異常。

事務管理方式

事務管理對於企業應用來說是至關重要的,即使出現異常情況,它也可以保證資料的一致性。

spring支援程式設計式事務管理和宣告式事務管理兩種方式。

程式設計式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於程式設計式事務管理,spring推薦使用TransactionTemplate。

宣告式事務管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前建立或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。

宣告式事務管理也有兩種常用的方式,一種是基於tx和aop名字空間的xml配置檔案,另一種就是基於@Transactional註解。顯然基於註解的方式更簡單易用,更清爽。

使用說明

當作用於類上時,該類的所有 public 方法將都具有該型別的事務屬性,同時,我們也可以在方法級別使用該標註來覆蓋類級別的定義。

在專案中,@Transactional(rollbackFor=Exception.class),如果類加了這個註解,那麼這個類裡面的方法丟擲異常,就會回滾,資料庫裡面的資料也會回滾。

在@Transactional註解中如果不配置rollbackFor屬性,那麼事物只會在遇到RuntimeException的時候才會回滾,加上rollbackFor=Exception.class,可以讓事物在遇到非執行時異常時也回滾

@Transactional註解的全部屬性詳解

@Transactional屬性

屬性 型別 描述
value String 可選的限定描述符,指定使用的事務管理器
propagation enum: Propagation 可選的事務傳播行為設定
isolation enum: Isolation 可選的事務隔離級別設定
readOnly boolean 讀寫或只讀事務,預設讀寫
timeout int (in seconds granularity) 事務超時時間設定
rollbackFor Class物件陣列,必須繼承自Throwable 導致事務回滾的異常類陣列
rollbackForClassName 類名陣列,必須繼承自Throwable 導致事務回滾的異常類名字陣列
noRollbackFor Class物件陣列,必須繼承自Throwable 不會導致事務回滾的異常類陣列
noRollbackForClassName 類名陣列,必須繼承自Throwable 不會導致事務回滾的異常類名字陣列