zoukankan      html  css  js  c++  java
  • spring 声明式事务

     Spring给了一个约定(AOP开发也给了我们一个约定),如果使用的是声明式事务,那么当你的业务方法不发生异常(或者发生异常,但该异常也被配置信息允许提交事务)时,Spring就会让事务管理器提交事务,而发生异常(并且该异常不被你的配置信息所允许提交事务)时,则让事务管理器回滚事务。

    Transactional的配置项

    <!--使用声明式事务配置注解驱动-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    使用XML进行配置事务管理器

      使用XML配置事务管理器的方法很多,但是也不常用,更多时我们会采用注解式的事务。为此笔者只介绍一种通用的XML声明式事务配置,不过它却在一定流程上揭露了事务管理器的内部实现。它需要一个事务拦截器——TransactionInterceptor,可以把拦截器想象成AOP编程。
      代码清单:配置事务拦截器
    <!--配置事务拦截器-->
    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager"/>
        <!-- 配置事务属性 -->
        <property name="transactionAttributes">
            <props>
                <!-- key代表的是业务方法的正则式匹配 ,而其内容可以配置各类事务定义参数-->
                <prop key="insert*">PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED</prop>
                <prop key="save*">PROPAGATION_REQUIRED,ISOLATION_READ_ UNCOMMITTED</prop>
                <prop key="add*">PROPAGATION_REQUIRED,ISOLATION_READ_ UNCOMMITTED</prop>
                <prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="del*">PROPAGATION_REQUIRED,ISOLATION_READ_ UNCOMMITTED</prop>
                <prop key="remove*">PROPAGATION_REQUIRED,ISOLATION_READ_ UNCOMMITTED</prop>
                <prop key="update*">PROPAGATION_REQUIRED,ISOLATION_READ_ UNCOMMITTED</prop>
            </props>
        </property>
    </bean>

      配置transactionAttributes的内容是需要关注的重点,Spring IoC启动时会解析这些内容,放到事务定义类Transac-tionDefinition中,再运行时会根据正则式的匹配度决定方法采取哪种策略。显然这使用了拦截器和Spring AOP的编程技术,这也揭示了声明式事务的底层原理——Spring AOP技术。
      还需要告诉Spring哪些类要使用事务拦截器进行拦截,为此我们再配置一个类BeanNameAutoProxyCreator
      代码清单:指明事务拦截器拦截哪些类
    <!--指明事务拦截器拦截哪些类-->
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <list>
                <value>*ServiceImpl</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <value>transactionInterceptor</value>
            </list>
        </property>
    </bean>
      BeanName属性告诉Spring如何拦截类。由于声明为*ServiceImpl,所有关于Service是现实类都会被其拦截,然后interceptorNames则是定义事务拦截器,这样对应的类和方法就会被事务管理器所拦截了。

    声明式事务的约定流程

      首先Spring通过事务管理器(PlatformTransactionManager的子类)创建事务,与此同时会把事务定义中的隔离级别、超时时间等属性根据配置内容往事务上设置。而根据传播行为配置采取一种特定的策略,后面会谈到传播行为的使用问题,这是Spring根据配置完成的内容,你只需要配置,无须编码。然后,启动开发者提供的业务代码,我们知道Spring会通过反射的方式调度开发者的业务代码,但是反射的结果可能是正常返回或者产生异常返回,那么它给的约定是只要发生异常,并且符合事务定义类回滚条件的,Spring就会将数据库事务回滚,否则将数据库事务提交,这也是Spring自己完成的。你会惊奇地发现,在整个开发过程中,只需要编写业务代码和对事务属性进行配置就可以了,并不需要使用代码干预,工作量比较少,代码逻辑也更为清晰,更有利于维护。


  • 相关阅读:
    apache安全—用户访问控制
    hdu 3232 Crossing Rivers 过河(数学期望)
    HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
    UVA 11020 Efficient Solutions (BST,Splay树)
    UVA 11922 Permutation Transformer (Splay树)
    HYSBZ 1208 宠物收养所 (Splay树)
    HYSBZ 1503 郁闷的出纳员 (Splay树)
    HDU 5416 CRB and Tree (技巧)
    HDU 5414 CRB and String (字符串,模拟)
    HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
  • 原文地址:https://www.cnblogs.com/ooo0/p/11029629.html
Copyright © 2011-2022 走看看