spring事物配置,宣告式事務管理和基於@Transactional註解的使用
spring支援程式設計式事務管理和宣告式事務管理兩種方式。
程式設計式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於程式設計式事務管理,spring推薦使用TransactionTemplate。
宣告式事務管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前建立或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。宣告式事務最大的優點就是不需要通過程式設計的方式管理事務,這樣就不需要在業務邏輯程式碼中摻雜事務管理的程式碼,只需在配置檔案中做相關的事務規則宣告(或通過基於@Transactional註解的方式),便可以將事務規則應用到業務邏輯中。
顯然宣告式事務管理要優於程式設計式事務管理,這正是spring倡導的非侵入式的開發方式。宣告式事務管理使業務程式碼不受汙染,一個普通的POJO物件,只要加上註解就可以獲得完全的事務支援。和程式設計式事務相比,宣告式事務唯一不足地方是,後者的最細粒度只能作用到方法級別,無法做到像程式設計式事務那樣可以作用到程式碼塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務管理的程式碼塊獨立為方法等等。
宣告式事務
1.基於tx和aop配置 2.基於註解@transcation
1.配置事務管理器,資料來源 -- dataSource
<bean id="finance-account-txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <qualifier value="finance-txManager"/> <property name="dataSource" ref="finance-account-dataSource" /> </bean>
2.屬性配置 -- annotation-driven
<tx:annotation-driven/> <tx:advice id="finance-account-repeatedReadTxAdvice" transaction-manager="finance-account-txManager"> <!-- the transactional semantics... --> <tx:attributes> <!--定義事務的傳播屬性,隔離級別--> <tx:method name="*" propagation="REQUIRED" isolation="REPEATABLE_READ" rollback-for="Throwable" /> </tx:attributes> </tx:advice>
<tx:advice id="finance-account-readCommitedTxAdvice" transaction-manager="finance-account-txManager"> <!-- the transactional semantics... --> <tx:attributes> <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" rollback-for="Throwable" /> </tx:attributes> </tx:advice>
<tx:advice id="finance-account-readCommitedTxAdvice-REQUIRES_NEW" transaction-manager="finance-account-txManager"> <!-- the transactional semantics... --> <tx:attributes> <tx:method name="*" propagation="REQUIRES_NEW" isolation="READ_COMMITTED" rollback-for="Throwable" /> </tx:attributes> </tx:advice>
3.aop配置
<aop:config proxy-target-class="true"> <!-- <aop:advisor pointcut="execution(* com.travelzen.tops.finance.account.service.impl.pay.FinanceCreditService.*(..))" advice-ref="finance-account-readCommitedTxAdvice" /> --> <aop:advisor pointcut="execution(* com.travelzen.tops.finance.account.service.impl.pay.FinanceAccountService.*(..))" advice-ref="finance-account-readCommitedTxAdvice" /> <aop:advisor pointcut="execution(* com.travelzen.tops.finance.account.service.impl.pay.FinanceAmountService.*(..))" advice-ref="finance-account-readCommitedTxAdvice" /> <aop:advisor pointcut="execution(* com.travelzen.tops.finance.account.service.impl.pay.FinanceCheckoutSerivce.*(..))" advice-ref="finance-account-readCommitedTxAdvice" />
2.註解事務
<!--配置spring事務管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
<!--開啟@Transactional註解的使用--> <tx:annotation-driver transaction-manager="transactionManager">
<!--將發生事務的程式碼全部放入一個上下文中--> <context:component-scan base-package="springtransactionpackage">
@Transcation引數 1.readOnly 只讀事務,true表示只讀,false表示可讀寫 @Transactional(readOnly=true) 2.rollbackFor 設定需要回滾的異常陣列 @Transactional(rollbackFor={RuntimeException.class, Exception.class}) 3.rollbackForClassName 該屬性用於設定需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,則進行事務回滾@Transactional(rollbackForClassName={"RuntimeException","Exception"}) 4.norollbackFor 5.norollbackForClassName 6.propagation 傳播屬性 7.isolation 隔離級別(該屬性用於設定底層資料庫的事務隔離級別,事務隔離級別用於處理事務併發的情況,一般使用資料庫預設的隔離級別就可以) 8.timeout設定事務超時秒數 ,預設值-1表示永不超時