在spring的配置檔案中,如果資料來源的defaultAutoCommit設定為True了,那麼方法中如果自己捕獲了異常,事務是不會回滾的,如果沒有自己捕獲異常則事務會回滾,如下例
比如配置檔案裡有這麼條記錄:
- <bean id="dataSource" class="xxx">
- <property name="xxx" value="xxx"/>
- <property name="xxx" value="xxx"/>
- ....
- <property name="defaultAutoCommit" value="true" />
- </bean>
那麼現在有兩個情況
情況1:如果沒有在程式中手動捕獲異常
- @Transactional(rollbackFor = { Exception.class })
- public void test() throws Exception {
- doDbStuff1();
- doDbStuff2();//假如這個運算元據庫的方法會丟擲異常,現在方法doDbStuff1()對資料庫的操作 會回滾。
- }
情況2:如果在程式中自己捕獲了異常
- @Transactional(rollbackFor = { Exception.class })
- public void test() {
- try {
- doDbStuff1();
- doDbStuff2();//假如這個運算元據庫的方法會丟擲異常,現在方法doDbStuff1()對資料庫的操作 不會回滾。
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
現在如果我們需要手動捕獲異常,並且也希望拋異常的時候能回滾腫麼辦呢?
下面這樣寫就好了,手動回滾事務:
- @Transactional(rollbackFor = { Exception.class })
- public void test() {
- try {
- doDbStuff1();
- doDbStuff2();
- } catch (Exception e) {
- e.printStackTrace();
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是這一句了,加上之後,如果doDbStuff2()拋了異常, //doDbStuff1()是會回滾的
- }
- }