運(yùn)用@Transactional,自己拋出異常時(shí)不會(huì)回滾的原因
對(duì)EJB來(lái)說(shuō),默認(rèn)的行為是EJB容器在遇到系統(tǒng)異常 (通常指運(yùn)行時(shí)異常)時(shí)自動(dòng)回滾當(dāng)前事務(wù)。EJB CMT遇到應(yīng)用異常 (例如,除了java.rmi.RemoteException 外別的checked exception)時(shí)并不會(huì)自動(dòng)回滾。默認(rèn)式Spring處理聲明式事務(wù)管理的規(guī)則遵守EJB習(xí)慣(只在遇到unchecked exceptions時(shí)自動(dòng)回滾),但通常定制這條規(guī)則會(huì)更有用。
所以
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();
}
}
(對(duì)該例的目的來(lái)說(shuō),上例中實(shí)現(xiàn)類(lèi)(DefaultFooService )的每個(gè)方法在其方法體中拋出UnsupportedOperationException 的做法是恰當(dāng)?shù)模覀兛梢钥吹?,事?wù)被創(chuàng)建出來(lái),響應(yīng)UnsupportedOperationException 的拋出,然后回滾。)
@Transactional 有關(guān)的設(shè)置
在最簡(jiǎn)單的形式下,@Transactional 指定一個(gè)接口、類(lèi)、方法必須是事務(wù)性的,其默認(rèn)事務(wù)語(yǔ)義為:read/write,PROPAGATION_REQUIRED,ISOLATION_DEFAULT ,TIMEOUT_DEFAULT ,而且僅當(dāng)遇到RuntimeException 時(shí)回滾,而不是Exception 。
改變事務(wù)設(shè)置的其他可選屬性
Table 9.1. Transactional 注解的屬性
屬性 | 類(lèi)型 | 描述 |
---|---|---|
傳播性 | 枚舉型:Propagation | 可選的傳播性設(shè)置 (默認(rèn)值:PROPAGATION_REQUIRED ) |
隔離性 | 枚舉型:Isolation | 可選的隔離性級(jí)別(默認(rèn)值:ISOLATION_DEFAULT ) |
只讀性 | 布爾型 | 讀寫(xiě)型事務(wù) vs. 只讀型事務(wù)(默認(rèn)值:false ,即只讀型事務(wù)) |
回滾異常類(lèi)(rollbackFor) | 一組 Class 類(lèi)的實(shí)例,必須是Throwable 的子類(lèi) | 一組異常類(lèi),遇到時(shí) 確保 進(jìn)行回滾。默認(rèn)情況下checked exceptions不進(jìn)行回滾,僅unchecked exceptions(即RuntimeException 的子類(lèi))才進(jìn)行事務(wù)回滾。 |
回滾異常類(lèi)名(rollbackForClassname) | 一組 Class 類(lèi)的名字,必須是Throwable 的子類(lèi) | 一組異常類(lèi)名,遇到時(shí) 確保 進(jìn)行回滾 |
不回滾異常類(lèi)(noRollbackFor) | 一組 Class 類(lèi)的實(shí)例,必須是Throwable 的子類(lèi) | 一組異常類(lèi),遇到時(shí)確保 不 回滾。 |
不回滾異常類(lèi)名(noRollbackForClassname) | 一組 Class 類(lèi)的名字,必須是Throwable 的子類(lèi) | 一組異常類(lèi),遇到時(shí)確保 不 回滾 |
我們推薦你參考 @Transactional 注解的javadoc,其中詳細(xì)列舉了上述各項(xiàng)屬性及其可選值。
————————————————————————————————————
通過(guò)以上可知,在spring 中運(yùn)用@Transactional 注解,自己拋出異常UnsupportedOperationException會(huì) 回滾,拋Exception異常,得作相關(guān)的配置才會(huì)回滾。
【編輯推薦】






