• Spring事务解析1-使用介绍


    spring的事务控制让我们从复杂的事务处理中得到解脱,是我们再也不需要去处理获得连接,关闭连接,事务提交和回滚等操作,再也不需要在事务相关的方法中处理大量的try..catch...finally代码。

    看下Spring中的事务控制的配置:

    <tx:annotation-driven transaction-manager="transactionManager"/>  
    <bean id="transactionManager" class="org.Springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dbcp"/>  
    </bean>  
      
    <util:properties id="db" location="classpath:db.properties">  
    </util:properties>  
    <bean id="dbcp" class="org.apache.commons.dbcp.BasicDataSource">  
      <property name="username" value="#{db.user}"></property>  
      <property name="password" value="#{db.pwd}"></property>  
      <property name="driverClassName" value="#{db.driver}"></property>  
      <property name="url" value="#{db.url}"></property>  
    </bean>  
      
    <bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
      <property name="dataSource" ref="dbcp"></property>  
      <property name="mapperLocations" value="classpath:org/tarena/note/sql/*.xml"> </property>  
    </bean>  

    MyBatis自动参与到Spring的事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可,否则事务管理会不起作用。同时不要忘记配置Spring-tx的命名空间。

    上述方法是一种事务控制,但是比较麻烦,它需要你在需要做事务控制的实现类上加上,@Transaction注解。还有一种配置方式,是关于Springmvc-Mybatis自动扫描的。

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
      <property name="dataSource" ref="dataSource" />   
    </bean>   
    <tx:advice id="txAdvice" transaction-manager="txManager">   
      <tx:attributes>   
        <tx:method name="find*" read-only="true"/>   
        <tx:method name="load*" read-only="true"/>   
        <tx:method name="*" rollback-for="CustomException"/>   
      </tx:attributes>   
    </tx:advice>   
    <aop:config>   
      <aop:pointcut id="fooServiceMethods" expression="execution(* com.sence.*.service.impl.*.*(..))"/>    
      <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/>    
    </aop:config>  

    这种方式比较流行,因为他不需要加自动扫描注解的@transaction注解。只需要配置Spring文件,然后可以针对各个方法进行只读或者更改数据库配置。

    ps:后面讨论的内容,是以第一种方法的源码为基础的。因为第一种是Spring事务控制的基础,第二种是在第一种的基础上操作的。

    此处有一点需要注意:默认情况下Spring中的事务处理只对RuntimeExcpetion方法进行回滚

    事务自定义标签

    对于Spring中事务功能的代码,配置文件中有这样一个配置:<tx:annotation-driven/>。这个是事务的开关,如果没有此处配置,Spring中不存在事务功能。

    使用关键字“annotation-driven”搜索全局代码,我们锁定 了TxNamespaceHandler中的init方法:

    public class TxNamespaceHandler extends NamespaceHandlerSupport {
        static final String TRANSACTION_MANAGER_ATTRIBUTE = "transaction-manager";
        static final String DEFAULT_TRANSACTION_MANAGER_BEAN_NAME = "transactionManager";
        static String getTransactionManagerName(Element element) {
            return (element.hasAttribute(TRANSACTION_MANAGER_ATTRIBUTE) ?
                    element.getAttribute(TRANSACTION_MANAGER_ATTRIBUTE) : DEFAULT_TRANSACTION_MANAGER_BEAN_NAME);
        }
        @Override
        public void init() {
            registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser());
            registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
            registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser());
        }
    
    }

    这里解析了spring事务控制的三种配置方式。从以上代码可以知道,在遇到<tx:annotation-driven>为开头的配置时,Spring就是使用AnnotationDrivenBeanDefinitionParse类进行解析。

    比如有一个方法为saveHerName()方法。

    加上事务控制后变成了这样(Spring的事务都是以AOP的方式实现的):

    con.setAutoCommit(false);  
    try{  
           saveHerName()  
           con.commit();  
    } catch(RunTimeExcpetion e){  
           con.rollback();  
    }  
  • 相关阅读:
    百度练习题 统计元音字母
    guess number
    LPTHW 结束了
    大坑
    LPTHW 笨办法学python 40章 类
    LPTHW 笨办法学python 37章 python关键字/关键词介绍
    dis进行反编译
    LPTHW 笨办法学python 33章
    eclipse安装详解以及遇到的问题
    安装eclipse错误Could not create the Java virtual machine
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/6080123.html
Copyright © 2020-2023  润新知