1. 程式人生 > >Spring事務管理之二

Spring事務管理之二

Spring 程式設計式事務和宣告式事務的區別 

  程式設計式事務處理:所謂程式設計式事務指的是通過編碼方式實現事務,允許使用者在程式碼中精確定義事務的邊界。即類似於JDBC程式設計實現事務管理。管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於程式設計式事務管理,spring推薦使用TransactionTemplate。

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

  簡單地說,程式設計式事務侵入到了業務程式碼裡面,但是提供了更加詳細的事務管理;而宣告式事務由於基於AOP,所以既能起到事務管理的作用,又可以不影響業務程式碼的具體實現。

基於註解@Transactional的事務實現

<!-- 配置事務管理器 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

       <property name="dataSource" ref="dataSource"></property>

</bean>

 <!-- 使得事務註解生效 -->

<tx:annotation-driven transaction-manager="transactionManager"/>

【總結】:基於宣告式的事務就是上面用的這種方法

第一步:在spring配置中配置事務管理器

第二步:在需要使用事務的方法前面加上@Transactional註解

使用tx標籤配置的攔截器

  <bean id="sessionFactory"    

         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">    

         <property name="configLocation" value="classpath:hibernate.cfg.xml" />    

        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  

  </bean>    

 <!-- 定義事務管理器(宣告式的事務) -->    

 <bean id="transactionManager"  

       class="org.springframework.orm.hibernate3.HibernateTransactionManager">  

     <property name="sessionFactory" ref="sessionFactory" />  

  </bean>  

 <tx:advice id="txAdvice" transaction-manager="transactionManager">  

       <tx:attributes>  

              <tx:method name="*" propagation="REQUIRED" />  

      </tx:attributes>  

</tx:advice>     

 <aop:config>  

       <aop:pointcut id="interceptorPointCuts"     expression="execution(* com.bluesky.spring.dao.*.*(..))" />  

       <aop:advisor advice-ref="txAdvice"    pointcut-ref="interceptorPointCuts" />          

 </aop:config>        

</beans>