事務不回滾


代碼寫法:

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數據庫,管理事務是在spring中完成。其實這里跟開發語言沒有任何關系,無論使用什么語言什么框架,都有可能遇到此類問題。分別以下述步驟進行了一番分析:

  1. 查看源碼,發現沒有邏輯錯誤

  2. 比對其他方法,業務異常

  3. 到目前為止只能懷疑數據庫了

    1. 查看數據庫的配置也無什么異常分別是InnoDB以及utf-8編碼

    2. 比對操作的表,發現出錯的表里使用的引擎(engine)是MyISAM,跟其他表的不一樣

結論

mysql一共提供了兩種引擎(engine),即InnoDB和MyISAM。查看兩種引擎的區別不難發現:

  • InnoDB supports transactions which is not supported by tables which use MyISAM storage engine.

  • InnoDB has row-level locking, relational integrity i.e. supports foreign keys, which is not possible in MyISAM.

  • InnoDB ‘s performance for high volume data cannot be beaten by any other storage engines available.

另外還有一個分析對比,選擇合適的引擎:

                                             My ISAM    InnoDB
Required full text Search                      Yes       5.6+
Require Transactions                                     Yes
frequent select queries                        Yes      
frequent insert,update,delete                            Yes
Row Locking (multi processing on single table)           Yes
Relational base design                                   Yes


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM