1. 程式人生 > >spring事物配置,宣告式事務管理和基於@Transactional註解的使用

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表示永不超時