1. 编程式事务管理
    对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。

  2. 基于 TransactionProxyFactoryBean的声明式事务管理
    <!-- 事务管理器 -->
        <bean id="myTracnsactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean> 
        <!-- 事务代理工厂 -->
        <!-- 生成事务代理对象 -->
        <bean id="serviceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager" ref="myTracnsactionManager"></property>
            <property name="target" ref="buyStockService"></property>
            <property name="transactionAttributes">
                <props>
                    <!-- 主要 key 是方法   
                        ISOLATION_DEFAULT  事务的隔离级别
                        PROPAGATION_REQUIRED  传播行为
                    -->
                    <prop key="add*">ISOLATION_DEFAULT,PROPAGATION_REQUIRED</prop>
                    <!-- -Exception 表示发生指定异常回滚,+Exception 表示发生指定异常提交 -->
                    <prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-BuyStockException</prop>
                </props>
            </property>
            
        </bean>

  3. 基于 @Transactional 的声明式事务管理

    在需要事务管理的方法上添加:( ISOLATION_DEFAULT  事务的隔离级别
          PROPAGATION_REQUIRED  传播行为)
    @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,rollbackFor=BuyStockException.class)
    applicationContenxt.xml添加如下:
    <!-- 事务管理器 -->
        <bean id="myTracnsactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <!-- 启用事务注解 -->
        <tx:annotation-driven transaction-manager="myTracnsactionManager"/>
    ps:@Transactional注解的方式配置文件要简单的多,将事务交给事务注解驱动。它有个缺陷是他会把所有的连接点都作为切点将事务织入进去,显然只需要在buyStock()方法织入事务即可。下面看看最后一种实现,它就可以精准的织入到指定的连接点

  4. 基于Aspectj AOP配置事务

     

    <!-- 事务管理器 -->
        <bean id="myTracnsactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <tx:advice id="txAdvice" transaction-manager="myTracnsactionManager">
            <tx:attributes>
                <!-- 为连接点指定事务属性 -->
                <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED"/>
                <tx:method name="buyStock" isolation="DEFAULT" propagation="REQUIRED" rollback-for="BuyStockException"/>
            </tx:attributes>
        </tx:advice>
        
        <aop:config>
            <!-- 切入点配置 -->
            <aop:pointcut expression="execution(* *..service.*.*(..))" id="point"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="point"/>

    </aop:config>

posted on 2019-07-12 17:28  vow007  阅读(7)  评论(0编辑  收藏  举报  来源