• spring---transaction(6)---事务的配置


    1 写在前面

      上一篇我们了解到spring的事务的体系。这里我们将结合上篇讲spring事务的配置

    2 Spring的三种事务配置形式

       2.1 使用TransactionProxyFactoryBean

    复制代码
    <bean id="proxy"
       class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <!-- 为事务代理工厂Bean注入事务管理器 -->
        <property name="transactionManager" ref="transactionManager" />
        <!-- 要在哪个Bean上面创建事务代理对象 -->
        <property name="target" ref="productDao" />
        <!-- 指定事务属性 -->
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>
    复制代码

      案例分析(上面有三大配置):

    • 事务管理器transactionManager
    • 事务配置的提供者transactionAttributes(用于指定哪些方法具有什么样的事务配置)

        有了以上2个元素,我们就可以创建出一个事务拦截器TransactionInterceptor

    • 要代理的对象target

    TransactionProxyFactoryBean这个工厂bean创建代理对象的原理就是:通过ProxyFactory来对target创建出代理对象了,同时加入上述事务拦截器,就可以实现事务拦截功能了

      2.2 使用aop:config和tx:advice

        使用TransactionProxyFactoryBean的方式只能针对一个target进行代理,如果想再代理一个target,就需要再配置一个TransactionProxyFactoryBean,比较麻烦,所以使用apo:config的配置形式,就可以针对符合Pointcut的所有target都可以进行代理。

        配置案例如下:

    复制代码
    <tx:advice id="txAdvice" transaction-manager="transactionManager">  
        <tx:attributes>  
            <tx:method name="add*" propagation="REQUIRED" />  
            <tx:method name="delete*" propagation="REQUIRED" />  
            <tx:method name="update*" propagation="REQUIRED" />  
            <tx:method name="add*" propagation="REQUIRED" />    
        </tx:attributes>  
    </tx:advice>  
    
    <aop:config>  
        <aop:pointcut id="pointcut" 
            expression="XXXX" />  
        <aop:advisor advice-ref="txAdvice" 
            pointcut-ref="pointcut" />  
    </aop:config>
    复制代码

      案例分析(上面有两大配置):

    • tx:advice:   有事务管理器transactionManager和事务配置提供者attributes,就可以产生一个事务拦截器TransactionInterceptor
    • aop:config: 这里会对符合pointcut的bean创建出代理对象,同时加入上述创建的事务拦截器

    2.3 使用@Transactional

      使用aop:config可以在xml中进行代理的配置,有时候想在代码中直接进行配置,这时候就需要使用注解@Transactional。

      案例如下(xml中启动@Transactional注解扫描):

        <!-- 开启注解事务管理 -->
        <tx:annotation-driven transaction-manager="txManager" />

      这样在代码中就可以通过配置@Transactional来实现事务拦截了

      在xml配置中启动注解扫描,会把那些加入了@Transactional标记的容器bean创建出代理对象,同时加入事务拦截器。在执行事务拦截的时候,会从@Transactional注解中取出对应的事务配置和事务管理器配置,进而可以执行事务的创建等操作。

  • 相关阅读:
    Leetcode 乘积最大子数组 (两种思路)
    C++string函数库-->to_string
    Zigzags CodeForces
    石子游戏(Leetcode每日一题)
    树形dp入门题(Leetcode 337. 打家劫舍 III)
    E
    背包九讲
    通过树状dp来求树的直径
    329. 矩阵中的最长递增路径(Leetcode每日一题)
    关于图的匹配,边覆盖,独立集,顶点覆盖
  • 原文地址:https://www.cnblogs.com/chihirotan/p/6804478.html
Copyright © 2020-2023  润新知