1. 程式人生 > >接收到普通Exception,事務無法回滾解決方案

接收到普通Exception,事務無法回滾解決方案

程式碼寫法:

複製程式碼
1 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class })
2     public void delRules(Integer id,String type) throws Exception {
3         ruleProductMapper.delRuleProductByRuleId(id, type);
4         ruleMapper.deleteByPrimaryKey(id);
5     }
複製程式碼

出現問題:手動new出異常後,事務不回滾

解決:原因是表的引擎是MySQL預設的myisam而不是Innodb;

java環境中的事物採用spring的xml配置,在service中如果丟擲Exception異常,則事物不能回滾。

原來預設spring只在發生未被捕獲的runtimeexcetpion時才回滾。spring的事務邊界是在呼叫業務方法之前開始的,業務方法執行完畢之後來執行commit or rollback(Spring預設取決於是否丟擲runtime異常,但是可以修改,見解決方法2). 如果丟擲runtime exception的話,事務會回滾。 一般不需要在業務方法中catch異常,如果非要catch,在做完你想做的工作後(比如關閉檔案等)一定要丟擲runtime exception,否則spring會將你的操作commit,這樣就會產生髒資料.

解決辦法有兩種:

1、  service中不丟擲Exception,使用try捕獲後丟擲runtimeexcetpion;

2、  修改spring的配置檔案

       <tx:method name=”save*” rollback-for=”java.lang.Exception”/>

3.TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常. 在service中增加資料庫回滾,不推薦使用。

以下內容轉自:http://my.oschina.net/crazyharry/blog/338468

摘要 當你使用了mysql資料庫管理資料.事務提交交給程式碼完成,然而當發生錯誤的時候事務未回滾。看下這篇文章也許你就明白了

MySQL 事務回滾 程式碼 事務未回滾