Spring事务细节【传播特性】:propagation

什么是事务的传播特性

事务的传播特性,指的是:一个子事务方法运行在另一个事务方法,这个子事务方法该如何进行?如:子事务方法可能在父事务中运行,也可能开启一个新的事务,并在自己的事务中运行。

@Service
public class AccountService {
    @Transactional
    public void laoda(){
        System.out.println("老大的方法");
        xiaodi();
        //老大方法出现异常,老大回滚,小弟的方法需要回滚么?
    }

    @Transactional
    public void xiaodi(){
        System.out.println("小弟的方法");
        //小弟方法出现异常,小弟回滚,老大的方法需要回滚么?
    }
}

spring七种传播特性:

传播特性说明
PROPAGATION_REQUIRED默认事务类型。如果当前没有事务,就新建自己的事务,并在自己的事务中运行;如果有,就运行在当前事务中
PROPAGATION_REQUIRES_NEW无论如何需要自己的事务。如果当前没有事务,就新建自己的事务,并在自己的事务中运行;如果有,则将当前事务挂起,运行自己的事务
PROPAGATION_NESTED如果当前没有事务,就新建一个事务并运行在自己的事务中;如果有,就在当前事务中的嵌套事务内运行。
PROPAGATION_SUPPORTS如果没有,就以非事务方式执行;如果有,就使用当前事务
PROPAGATION_MANDATORY当前方法必须运行在事务内部。如果当前没有事务,就抛出异常
PROPAGATION_NEVER当前的方法不应该运行在事务中。如果有运行的事务,就抛出异常
PROPAGATION_NOT_SUPPORTED如果当前没有事务,就以非事务方式执行;如果有,就将当前事务挂起。即以非事务状态运行,不加入到事务中

默认是PROPAGATION_REQUIRED

public @interface Transactional {
    ...
    Propagation propagation() default Propagation.REQUIRED;
    ...
}

测试代码 待完善!!!!

子事务的传播特性为Propagation.REQUIRED+运行时异常+抛出异常
子事务的传播特性为Propagation.REQUIRED+运行时异常+不抛出异常
父事务运行时异常+抛出异常
父事务运行时异常+不抛出异常

子事务的传播特性为Propagation.REQUIRED+编译型异常+抛出异常
子事务的传播特性为Propagation.REQUIRED+编译型异常+不抛出异常
父事务编译型异常+抛出异常
父事务编译型异常+不抛出异常

子事务的传播特性为Propagation.REQUIRED,则子事务的timeout等事务属性不起作用了,需要看父事务的事务属性

https://blog.csdn.net/c_ajing/article/details/106054265

已经完成的PROPAGATION_REQUIRES_NEW事务不会回滚。

原理:
REQUIRED:将父事务用的connection传递给子事务使用
REQUIRES_NEW:新创建了connection

spring事务什么情况下不起作用

    1. try-catch了异常  
    2. 在类中内部调用,这个时候会用this关键字.
       导致没有通过代理去走此方法,从而没有开启事务.即调用方法的对象不是aop代理对象 
    4. 被@Transactional 注解修饰的方法, 修饰符非public 或者被final修饰. Aop没办法为其生成一个代理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值