配置事务以及事务回滚

下表显示了不同隔离级别允许的并发副作用。
隔离级别
脏读
虚拟读取
未提交读
已提交读
快照

事务传播机制

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是 最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。

当使用 PROPAGATION_NESTED 时, 底层的数据源必须基于 JDBC 3.0 ,并且实现者需要支持保存点事务机制。

 

话不多说,实例走起

实例为是购买股票的案例,实例不是重点,重点是如何配置事务

第一种

 <!--第一种配置TransactionProxyFactoryBean  事务代理工厂bean-->
    <bean class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager"></property>
        <property name="target" ref="cgyService"></property>
        <property name="transactionAttributes">
            <props>
                <prop key="cgy">ISOLATION_DEFAULT,PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

其中key的值为方法名添加事务回滚的话,在prop节点中添加 “-异常类”,

第二种 

<!--第二种 事务注解失败-->
 <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

相当简洁的一句话,但需要在类中加入@Transaction();

添加事务回滚:

@Transactional(rollbackFor = cgyException.class)

rollbackFor= 异常类.class

第三种
 <!--第三种 使用Aspectj aop 配置-->
    <tx:advice id="myadvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="cgyService" isolation="DEFAULT" propagation="REQUIRED" rollback-for="cgyException"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="myPoint" expression="execution(* *..dome06.service.*.*(..))"></aop:pointcut>
        <aop:advisor advice-ref="myadvice" pointcut-ref="myPoint"></aop:advisor>
    </aop:config>

事务回滚就是rollback-for=“异常类”;

ok!!!!

原文地址:https://www.cnblogs.com/ztm1021810064/p/8588239.html