Spring@Transactional事務回滾


Spring中事務分為編程時事務和聲明式事務,編程式事務:編程人員通過代碼控制事務的開啟、回滾、提交,聲明式事務:把事務的處理交給spring。使用注解@transactional配置就是聲明式事務。

基本配置
在applicationContext.xml配置文件中

1 //配置spring的DataSourceTransactionManager事務管理器
2 <bean id="transactionManager"
3         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
4         <property name="dataSource" ref="defaultDataSource" />//指向的數據源
5     </bean> 
6  //配置事務注解驅動
7 <tx:annotation-driven transaction-manager="transactionManager"/>

然后在需要事務管理的地方加@Transactional 注解。

實現事務回滾需要注意的問題:
1.@Transactional 注解可以被應用於接口定義和接口方法、類定義和類的 public 方法上。
2.@Transactional 注解只能應用到 public 可見度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不會報錯,但是這個被注解的方法將不會展示已配置的事務設置。
3.默認情況下,spring會對unchecked異常進行事務回滾;如果是checked異常則不回滾。
如果事務在try{}catch(Exception e){e.printStackTrace();}中跑,並且catch中只是打印e的話,那么事務不會rollback。因為異常被catch掉了,框架不知道發生了常。
如果想要rollback,
(1)注解上面寫明異常類型即可,@Transactional(rollbackFor=Exception.class) 
(2)在方法上添加 throws Exception,將方法中出現的異常拋出給spring事務 
(3)去掉方法體中的try catch 
(4)catch (Exception e) { throw e;}繼續向上拋,目的是讓spring事務捕獲這個異常
 除了以上注意的問題,說一下最近遇到的關於多數據源配置事務回滾的問題
在項目中關於事務該配置的也配置了,需要注意的問題也注意了,但有的事務可以出現回滾有的回滾失敗,最終問題所在: id相同的事務配置分別配置在兩個application.xml文件中,如果多個application.xml有配置,在web.xml中后加載的application.xml中的事務配置會覆蓋最先加的application.xml中的事務配置。


免責聲明!

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



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