• Spring配置事务的五种方式


     Java事务的类型有三种:

    JDBC事务、 可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库

    JTA(Java Transaction API)事务、事务可以跨越多个数据库或多个DAO,使用也比较复杂。

    容器事务。主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。

    spring事务的配置方式编程式事务和声明式事务,相信大家都知道是有5种,但我们经常使用的应该就是基于注解和tx标签配置拦截器两种方式了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       <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>

    ps:声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

    1、基于注解,DAO上需加上@Transactional注解

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


    2、使用tx标签配置的拦截器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <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>

    3、使用拦截器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <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>

    4、所有Bean共享一个代理基类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <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>

    5、每个Bean都有一个代理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <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>
  • 相关阅读:
    蓝桥杯 包子凑数(完全背包、裴蜀定理、赛瓦维斯特定理)
    AcWing 255. 第K小数主席树(可持久化线段树) 模板题
    HDU 1698 Just a Hook [线段树+区间修改为一个值+区间查询]
    POJ 3264 Balanced Lineup
    AcWing 1277. 维护序列
    HDU 3577 Fast Arrangement [线段树+区间修改+维护最大值]
    【学习笔记】权值线段树
    NOIP2017 小凯的疑惑 解题报告(赛瓦维斯特定理)
    k8s (kubenetes)集成runner 清明
    gitlab CIDI 构建环境优化 清明
  • 原文地址:https://www.cnblogs.com/shuchen007/p/9202758.html
Copyright © 2020-2023  润新知