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中的事務配置。