zoukankan      html  css  js  c++  java
  • spring事物的传播行为

    1.spring事物的传播行为,主要是用来解决业务层拥有事物的方法,相互调用的问题。

    2.声明事物,

    在代码执行前,开启事务。代码执行完,提交事务

    3.spring并没有提供事务具体的处理,而只是调用orm框架的事务,connection的事务。

    spring只是对底层事务做了一层封装。

    4.spring对事务管理主要用了三个APi。PlatformTransactionManager ,TransactionDefinition,和TransactionStatus。

    spring对TransactionManager不同的orm框架进行了不同的实现,如hibernate TransactionManager,DatasourceTransactionManager。

     不同的transactionManager实现。

    5.TransactionDefiniton定义了事务具体的定义,如传播状态,隔离级别,和是否只读。

    6.谈吐自信

    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才是真正的事务管理源。

    一、声明对本地事务的支持:

    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();
        }  
    }

    本文部分转自http://www.mamicode.com/info-detail-1248286.html

  • 相关阅读:
    HDU 3951 (博弈) Coin Game
    HDU 3863 (博弈) No Gambling
    HDU 3544 (不平等博弈) Alice's Game
    POJ 3225 (线段树 区间更新) Help with Intervals
    POJ 2528 (线段树 离散化) Mayor's posters
    POJ 3468 (线段树 区间增减) A Simple Problem with Integers
    HDU 1698 (线段树 区间更新) Just a Hook
    POJ (线段树) Who Gets the Most Candies?
    POJ 2828 (线段树 单点更新) Buy Tickets
    HDU 2795 (线段树 单点更新) Billboard
  • 原文地址:https://www.cnblogs.com/panxuejun/p/5998694.html
Copyright © 2011-2022 走看看