java spring事物傳播行爲

spring事物的傳播行爲

1.spring事物的傳播行爲,主要是用來解決業務層擁有事物的方法,相互調用的問題。html

2.聲明事物,java

在代碼執行前,開啓事務。代碼執行完,提交事務spring

3.spring並無提供事務具體的處理,而只是調用orm框架的事務,connection的事務。sql

spring只是對底層事務作了一層封裝。express

4.spring對事務管理主要用了三個APi。PlatformTransactionManager ,TransactionDefinition,和TransactionStatus。session

spring對TransactionManager不一樣的orm框架進行了不一樣的實現,如hibernate TransactionManager,DatasourceTransactionManager。框架

 不一樣的transactionManager實現。dom

5.TransactionDefiniton定義了事務具體的定義,如傳播狀態,隔離級別,和是否只讀。this

6.談吐自信spa

7。事務的提交和回滾操做都是由platformtransactionManager來操控的。

public interface PlatformTransactionManager {    
       TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;    
       void commit(TransactionStatus status) throws TransactionException;    
       void rollback(TransactionStatus status) throws TransactionException;    
}
  • getTransaction():返回一個已經激活的事務或建立一個新的事務(根據給定的TransactionDefinition類型參數定義的事務屬性),返回的是TransactionStatus對象表明了當前事務的狀態,其中該方法拋出TransactionException(未檢查異常)表示事務因爲某種緣由失敗。
  • commit():用於提交TransactionStatus參數表明的事務,具體語義請參考Spring Javadoc;
  • rollback():用於回滾TransactionStatus參數表明的事務,具體語義請參考Spring Javadoc。

8.

TransactionDefinition接口定義以下:

  1. public interface TransactionDefinition {    
  2.        int getPropagationBehavior();    
  3.        int getIsolationLevel();    
  4.        int getTimeout();    
  5.        boolean isReadOnly();    
  6.        String getName();    
  7. }   
  • getPropagationBehavior():返回定義的事務傳播行爲;
  • getIsolationLevel():返回定義的事務隔離級別;
  • getTimeout():返回定義的事務超時時間;
  • isReadOnly():返回定義的事務是不是隻讀的;
  • getName():返回定義的事務名字。

 

 

TransactionStatus接口定義以下:

  1. public interface TransactionStatus extends SavepointManager {    
  2.        boolean isNewTransaction();    
  3.        boolean hasSavepoint();    
  4.        void setRollbackOnly();    
  5.        boolean isRollbackOnly();    
  6.        void flush();    
  7.        boolean isCompleted();    
  8. }    

內置事務管理器實現

 

Spring提供了許多內置事務管理器實現:

  • DataSourceTransactionManager:位於org.springframework.jdbc.datasource包中,數據源事務管理器,提供對單個javax.sql.DataSource事務管理,用於Spring JDBC抽象框架、iBATIS或MyBatis框架的事務管理;
  • JdoTransactionManager:位於org.springframework.orm.jdo包中,提供對單個javax.jdo.PersistenceManagerFactory事務管理,用於集成JDO框架時的事務管理;
  • JpaTransactionManager:位於org.springframework.orm.jpa包中,提供對單個javax.persistence.EntityManagerFactory事務支持,用於集成JPA實現框架時的事務管理;
  • HibernateTransactionManager:位於org.springframework.orm.hibernate3包中,提供對單個org.hibernate.SessionFactory事務支持,用於集成Hibernate框架時的事務管理;該事務管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;

 

9.註冊事務管理器bean的時候,必須依賴注入datasource.由於datasource包含connection啊。connection纔是真正的事務管理源。

1、聲明對本地事務的支持:

a)JDBC及iBATIS、MyBatis框架事務管理器

  1. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    
  2.     <property name="dataSource" ref="dataSource"/>    
  3. </bean>    

10.經過dataSource屬性指定須要事務管理的單個javax.sql.DataSource對象。

 總結來講:當咱們使用JDBC時,咱們調用的是DataSourceTransactionManager;當咱們使用JTA時,咱們調用的是JtaTransactionManager;而當咱們使用Hibernate時,咱們調用的是HibernateTransactionManager...其實,spring的事務管理,不論你最終採用哪一種技術,它都是接口PlatformTransactionManager的一種實現。

 

11.Spring爲各個平臺如JDBC、Hibernate等都提供了對應的事務管理器,可是具體的實現就是各個平臺本身的事情了。

12.spring有5種事務代理機制,根據代理機制的不一樣,總結了五種Spring事務的配置方式,

1.利用TransactionProxyFactoryBean 爲每一個bean配置一個代理

 

<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>

    <!-- 配置DAO -->
    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="userDao" 
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
           <!-- 配置事務管理器 --> 
           <property name="transactionManager" ref="transactionManager" />    
        <property name="target" ref="userDaoTarget" /> 
         <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
        <!-- 配置事務屬性 --> 
        <property name="transactionAttributes"> 
            <props> 
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props> 
        </property> 
    </bean> 
</beans>

 

(2)全部Bean共享一個代理基類

 

<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>

    <bean id="transactionBase" 
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
            lazy-init="true" abstract="true"> 
        <!-- 配置事務管理器 --> 
        <property name="transactionManager" ref="transactionManager" /> 
        <!-- 配置事務屬性 --> 
        <property name="transactionAttributes"> 
            <props> 
                <prop key="*">PROPAGATION_REQUIRED</prop> 
            </props> 
        </property> 
    </bean>   

    <!-- 配置DAO -->
    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="userDao" parent="transactionBase" > 
        <property name="target" ref="userDaoTarget" />  
    </bean>
</beans>

 

(3)使用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>

 

(4)使用攔截器

 

<!-- 定義事務管理器(聲明式的事務) --> 
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean> 

    <bean id="transactionInterceptor" 
        class="org.springframework.transaction.interceptor.TransactionInterceptor"> 
        <property name="transactionManager" ref="transactionManager" /> 
        <!-- 配置事務屬性 --> 
        <property name="transactionAttributes"> 
            <props> 
                <prop key="*">PROPAGATION_REQUIRED</prop> 
            </props> 
        </property> 
    </bean>

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
        <property name="beanNames"> 
            <list> 
                <value>*Dao</value>
            </list> 
        </property> 
        <property name="interceptorNames"> 
            <list> 
                <value>transactionInterceptor</value> 
            </list> 
        </property> 
    </bean> 

    <!-- 配置DAO -->
    <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>

 

(5)全註解

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <context:annotation-config />
    <context:component-scan base-package="com.bluesky" />

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

    <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>

</beans>
此時在DAO上需加上@Transactional註解,以下:

package com.bluesky.spring.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

import com.bluesky.spring.domain.User;

@Transactional
@Component("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    public List<User> listUsers() {
        return this.getSession().createQuery("from User").list();
    }  
}
相關文章
相關標籤/搜索