運用@Transactional,本身拋出異常時不會回滾的緣由,經驗之談

查看spring API可知 http://www.kuqin.com/spring2.0_doc/index.html html

對EJB來講,默認的行爲是EJB容器在遇到系統異常 (一般指運行時異常)時自動回滾當前事務。EJB CMT遇到應用異常 (例如,除了java.rmi.RemoteException 外別的checked exception)時並不會自動回滾。默認式Spring處理聲明式事務管理的規則遵照EJB習慣(只在遇到unchecked exceptions時自動回滾),但一般定製這條規則會更有用。java

因此spring

package x.y.service;

public class DefaultFooService implements FooService {

public Foo getFoo(String fooName) {
throw new UnsupportedOperationException();
}

public Foo getFoo(String fooName, String barName) {
throw new UnsupportedOperationException();
}

public void insertFoo(Foo foo) {
throw new UnsupportedOperationException();
}

public void updateFoo(Foo foo) {
throw new UnsupportedOperationException();
}
}spa

(對該例的目的來講,上例中實現類(DefaultFooService )的每一個方法在其方法體中拋出UnsupportedOperationException 的作法是恰當的,咱們能夠看到,事務被建立出來,響應UnsupportedOperationException 的拋出,而後回滾。) htm

@Transactional 有關的設置blog

在最簡單的形式下,@Transactional 指定一個接口、類、方法必須是事務性的,其默認事務語義爲:read/write,PROPAGATION_REQUIREDISOLATION_DEFAULTTIMEOUT_DEFAULT ,並且僅當遇到RuntimeException 時回滾,而不是Exception接口

改變事務設置的其餘可選屬性事務

Table 9.1. Transactional 註解的屬性 get

屬性 類型 描述
傳播性 枚舉型:Propagation 可選的傳播性設置 (默認值:PROPAGATION_REQUIRED
隔離性 枚舉型:Isolation 可選的隔離性級別(默認值:ISOLATION_DEFAULT
只讀性 布爾型 讀寫型事務 vs. 只讀型事務(默認值:false ,即只讀型事務)
回滾異常類(rollbackFor) 一組 Class 類的實例,必須是Throwable 的子類 一組異常類,遇到時 確保 進行回滾。默認狀況下checked exceptions不進行回滾,僅unchecked exceptions(即RuntimeException 的子類)才進行事務回滾。
回滾異常類名(rollbackForClassname) 一組 Class 類的名字,必須是Throwable 的子類 一組異常類名,遇到時 確保 進行回滾
不回滾異常類(noRollbackFor) 一組 Class 類的實例,必須是Throwable 的子類 一組異常類,遇到時確保 回滾。
不回滾異常類名(noRollbackForClassname) 一組 Class 類的名字,必須是Throwable 的子類 一組異常類,遇到時確保 回滾
屬性 類型 描述
傳播性 枚舉型:Propagation 可選的傳播性設置 (默認值:PROPAGATION_REQUIRED
隔離性 枚舉型:Isolation 可選的隔離性級別(默認值:ISOLATION_DEFAULT
只讀性 布爾型 讀寫型事務 vs. 只讀型事務(默認值:false ,即只讀型事務)
回滾異常類(rollbackFor) 一組 Class 類的實例,必須是Throwable 的子類 一組異常類,遇到時 確保 進行回滾。默認狀況下checked exceptions不進行回滾,僅unchecked exceptions(即RuntimeException 的子類)才進行事務回滾。
回滾異常類名(rollbackForClassname) 一組 Class 類的名字,必須是Throwable 的子類 一組異常類名,遇到時 確保 進行回滾
不回滾異常類(noRollbackFor) 一組 Class 類的實例,必須是Throwable 的子類 一組異常類,遇到時確保 回滾。
不回滾異常類名(noRollbackForClassname) 一組 Class 類的名字,必須是Throwable 的子類 一組異常類,遇到時確保 回滾
屬性 類型 描述
傳播性 枚舉型:Propagation 可選的傳播性設置 (默認值:PROPAGATION_REQUIRED
隔離性 枚舉型:Isolation 可選的隔離性級別(默認值:ISOLATION_DEFAULT
只讀性 布爾型 讀寫型事務 vs. 只讀型事務(默認值:false ,即只讀型事務)
回滾異常類(rollbackFor) 一組 Class 類的實例,必須是Throwable 的子類 一組異常類,遇到時 確保 進行回滾。默認狀況下checked exceptions不進行回滾,僅unchecked exceptions(即RuntimeException 的子類)才進行事務回滾。
回滾異常類名(rollbackForClassname) 一組 Class 類的名字,必須是Throwable 的子類 一組異常類名,遇到時 確保 進行回滾
不回滾異常類(noRollbackFor) 一組 Class 類的實例,必須是Throwable 的子類 一組異常類,遇到時確保 回滾。
不回滾異常類名(noRollbackForClassname) 一組 Class 類的名字,必須是Throwable 的子類 一組異常類,遇到時確保 回滾

咱們推薦你參考 @Transactional 註解的javadoc,其中詳細列舉了上述各項屬性及其可選值。it

————————————————————————————————————

經過以上可知,在spring 中運用@Transactional 註解,本身拋出異常UnsupportedOperationException會 回滾,拋Exception異常,得做相關的配置纔會回滾。

相關文章
相關標籤/搜索