事務管理對於企業應用來說是至關重要的,當出現異常情況時,它可以保證數據的一致性.
Spring事務管理的兩種方式
1.編程式事務 使用Transaction Ttempleate或者直接使用底層的Platform TransactionManager.對於編程式事務管理,spring推薦使用Transaction Template
簡單的說就是在代碼中需要直接加入處理事務的邏輯,可能需要在代碼中顯式調用begin Transaction() commit(). rollback() 等事務管理相關的方法,如在執行a方法的時候需要事務處理,你需要在a方法開始時候開啟事務,處理完成之后,在方法結束的時候,關閉事務.
2.聲明式事務 建立在AOP之上的,其本質是對方法前后進行攔截,然后在目標方法開始之前創建或者加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務,聲明式事務最大的優點就是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需要在配置文件中做相關的事務規則聲明(或通過基於@Transaction注解的方式),便可以將事務規則應用到業務邏輯中.
顯然聲明式事務管理要優於編程式事務管理,這正是spring倡導的非侵入式的開發方式.聲明式事務管理使業務代碼不受污染,一個普通的POJO對象,只要加上注解就可以獲得完全的事務支持.和編程式事務相比,聲明式事務唯一不足的地方是,它的最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別.但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務管理的代碼塊獨立為方法等等.
聲明式事務管理也有兩種常用的方式,一種是基於tx和aop名字的xml配置文件,另一種就是基於@Transaction注解.顯然基於注解的方式更簡易.更清爽.
以Mybatis為例,基於注解的聲明式事務配置
1.添加tx名字空間
xmlns:tx="http://www.springframework.org/schema/tx"
2.開啟事務的注解支持
<!-- 開啟事務控制的注解支持 --> <tx:annotation-driven transaction-manager="transactionManager"/>
3、MyBatis自動參與到spring事務管理中,無需額外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的數據源與DataSourceTransactionManager引用的數據源一致即可。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation"> <value>classpath:mybatis-config.xml</value> </property> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
使用@Transactional注解
@Transactional 可以作用於接口、接口方法、類以及類方法上。當作用於類上時,該類的所有 public 方法將都具有該類型的事務屬性,同時,我們也可以在方法級別使用該注解來覆蓋類級別的定義。
雖然 @Transactional 注解可以作用於接口、接口方法、類以及類方法上,但是 Spring 建議不要在接口或者接口方法上使用該注解,因為這只有在使用基於接口的代理時它才會生效。另外, @Transactional 注解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者默認可見性的方法上使用 @Transactional 注解,這將被忽略,也不會拋出任何異常。
