1. 程式人生 > >spring事務配置方式之mybatis

spring事務配置方式之mybatis

spring支援程式設計式事務管理和宣告式事務管理兩種方式。

        程式設計式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於程式設計式事務管理,spring推薦使用TransactionTemplate。

        宣告式事務管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前建立或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。宣告式事務最大的優點就是不需要通過程式設計的方式管理事務,這樣就不需要在業務邏輯程式碼中摻雜事務管理的程式碼,只需在配置檔案中做相關的事務規則宣告(或通過基於@Transactional註解的方式),便可以將事務規則應用到業務邏輯中。

       顯然宣告式事務管理要優於程式設計式事務管理,這正是spring倡導的非侵入式的開發方式。宣告式事務管理使業務程式碼不受汙染,一個普通的POJO物件,只要加上註解就可以獲得完全的事務支援。和程式設計式事務相比,宣告式事務唯一不足地方是,後者的最細粒度只能作用到方法級別,無法做到像程式設計式事務那樣可以作用到程式碼塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務管理的程式碼塊獨立為方法等等。

         宣告式事務管理也有兩種常用的方式,一種是基於tx和aop名字空間的xml配置檔案,另一種就是基於@Transactional註解。顯然基於註解的方式更簡單易用,更清爽。

  • myBatis為例   基於註解的宣告式事務管理配置@Transactional
  1.  <!-- 配置spring的PlatformTransactionManager,名字為預設值 -->
  2.     <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3.         <propertyname="dataSource"ref="dataSource"/>
  4.     </bean>
  5.     <!-- 開啟事務控制的註解支援 -->
  6.     <tx:annotation-driventransaction-manager="transactionManager"/></span></span>

@Transactional註解

用法

       @Transactional 可以作用於介面、介面方法、類以及類方法上。當作用於類上時,該類的所有 public 方法將都具有該型別的事務屬性,同時,我們也可以在方法級別使用該標註來覆蓋類級別的定義。

         雖然 @Transactional 註解可以作用於介面、介面方法、類以及類方法上,但是 Spring 建議不要在介面或者介面方法上使用該註解,因為這隻有在使用基於介面的代理時它才會生效。另外, @Transactional 註解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者預設可見性的方法上使用 @Transactional 註解,這將被忽略,也不會丟擲任何異常。

        預設情況下,只有來自外部的方法呼叫才會被AOP代理捕獲,也就是,類內部方法呼叫本類內部的其他方法並不會引起事務行為,即使被呼叫方法使用@Transactional註解進行修飾。

  • myBatis為例   基於註解的宣告式事務管理配置,xml配置

主要為aop切面配置,只看xml就可以了

  1. <!-- 事物切面配置 -->
  2. <tx:adviceid="advice"transaction-manager="transactionManager">
  3.     <tx:attributes>
  4.         <tx:methodname="update*"propagation="REQUIRED"read-only="false"rollback-for="java.lang.Exception"/>
  5.         <tx:methodname="insert"propagation="REQUIRED"read-only="false"/>
  6.     </tx:attributes>
  7. </tx:advice>
  8. <aop:config>
  9.     <aop:pointcutid="testService"expression="execution (* com.baobao.service.MyBatisService.*(..))"/>
  10.     <aop:advisoradvice-ref="advice"pointcut-ref="testService"/>
  11. </aop:config>