spring 的事务传播性,多操作,多尝试

一、事务的传播性

只要和数据库交互,一定会使用到事务,那么事务的传播性有哪几类。

事务种类(源码)

public enum Propagation {
    REQUIRED(0),
    SUPPORTS(1),
    MANDATORY(2),
    REQUIRES_NEW(3),
    NOT_SUPPORTED(4),
    NEVER(5),
    NESTED(6);

    private final int value;

    private Propagation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value; 
    }
}

二、事务传播性的大类

1、REQUIRED 默认事务

直接使用注解@Transactional,默认的就是REQUIRED,也可以不声明,可以使用在增删改。
如果在一个方法A中调用了两个方法,如果使用REQUIRED,就意味着整体创建了一个事务。如果子方法开启了一个事务,默认会加入到A的事务中形成一个事务整体

2、SUPPORTS

如果当前有事务,则使用事务,如果没有事务则不启用事务。 如A掉用BC两个方法,A上面没有事务,则BC上增加SUPPORTS ,则数据不会回滚。如果A上有事务,
则BC事务生效,如果出现异常,数据会回滚。

3、MANDATORY

MANDATORY强制性的,如果A调用BC,BC使用了MANDATORY,然后A上面没有配置事务,则运行则会抛出异常。如果A使用了事务,调用BC,则正常使用。

4、REQUIRES_NEW

创建一个新事务,并挂起当前事务,出现两个事务。 例如 A方法调用BC方法,B上面有REQUIRES_NEW事务标识,C没有。执行后,B中如果有异常,B中的数据会回滚,C正常执行完成。
如果A使用REQUIRED事务,如果BC有REQUIRES_NEW则新开启一个事务,如果没有就REQUIRED

5、NOT_SUPPORTED

不使用事务。例如A方法调用BC方法。 如果A方法有事务REQUIRED,B方法有事务NOT_SUPPORTED,如果出现异常C方法数据会回滚,B方法则不会回滚。

6、NEVER

不允许有事务,例如A调用BC,A使用了事务,BC使用了NEVER,则会抛出非法事务的异常。

7、NESTED

嵌套事务,如果当前有事务,就创建子事务。例如A方法调用BC方法,如果A使用REQUIRED,BC中使用NESTED事务,A中发生异常时,事务会被回滚。如果A没有事务,A发生异常时,事务不会回滚。
如果时B发生异常时,如果不捕获,主事务也会回滚。如果主事务提交,子事务会一并提交。

以上内容如果有不完整的,大神们勿喷,请指教。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值