關於Spring事務回滾的問題

在Spring的配置文件中,若是數據源的defaultAutoCommit設置爲True了,那麼方法中若是本身捕獲了異常,事務是不會回滾的,若是沒有本身捕獲異常則事務會回滾,以下例 好比配置文件裏有這麼條記錄: <bean id="dataSource" class="xxx">
<property name="xxx" value="xxx"/>
<property name="xxx" value="xxx"/>
....
<property name="defaultAutoCommit" value="true" />
</bean>java

那麼如今有兩個狀況 狀況1:若是沒有在程序中手動捕獲異常 [java] view plain copy print? @Transactional(rollbackFor = { Exception.class })
public void test() throws Exception {
doDbStuff1();
doDbStuff2();//假如這個操做數據庫的方法會拋出異常,如今方法doDbStuff1()對數據庫的操做 會回滾。
}數據庫

狀況2:若是在程序中本身捕獲了異常 [java] view plain copy print? @Transactional(rollbackFor = { Exception.class })
public void test() {
try {
doDbStuff1();
doDbStuff2();//假如這個操做數據庫的方法會拋出異常,如今方法doDbStuff1()對數據庫的操做 不會回滾。
} catch (Exception e) {
e.printStackTrace();
}
}事務

如今若是咱們須要手動捕獲異常,而且也但願拋異常的時候能回滾腫麼辦呢? 下面這樣寫就行了,手動回滾事務: [java] view plain copy print? @Transactional(rollbackFor = { Exception.class })
public void test() {
try {
doDbStuff1();
doDbStuff2();
} catch (Exception e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是這一句了,加上以後,若是doDbStuff2()拋了異常, //doDbStuff1()是會回滾的
}
}it

相關文章
相關標籤/搜索