Java中关于Spring框架事务的传播特性方式的验证

Spring事务的传播特性

Spring事务的传播行为指的是多个事务存在的时候,Spring如何处理

Spring中事务的传播特性有以下7种:

  • REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

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

  • MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。

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

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

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

  • NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

示例说明

Spring项目里有以下三个方法

通过设置不同的事物传播方式,来观察7种事务传播方式是如何定义的:

    @Transactional(propagation = Propagation...)
    public boolean add1() {
       //添加一个用户
    }

    @Transactional(propagation = Propagation...)
    public boolean add2() {
       //添加一个用户
       throw new RuntimeException("事务传播性测试");
    }

    @Transactional
    //@Transactional
    public String transactionTest() {
        boolean result = userService.add1();
        boolean result2 = userService.add2();
        return "添加一个用户,result: " + result + " result2: " + result2;
    }

得出以下结论:

  1. REQUIRED:如果外层transactionTest()开启了事务,则add1和add2都加入transactionTest()的事务中,属于同一个事务。否则,add1和add2则都会创建一个自己的事务,属于分开的两个事务

  2. SUPPORTS:如果外层transactionTest()开启了事务,则add1和add2都加入transactionTest()的事务中,属于同一个事务。否则,add1和add2都不会创建事务

  3. MANDATORY:如果外层transactionTest()没有开启了事务,则会抛出异常。如果有则加入

  4. REQUIRES_NEW:不管外层transactionTest()有没有开启事务,add1和add2都创建各自的事务

  5. NOT_SUPPORTED:不使用事务,也不会抛出异常

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

  7. NESTED:如果外层transactionTest()开启了事务,则创建一个嵌套事务(内部事务回滚不影响外部事务提交,外部事务回滚会把内部事务回滚)。如果外层没有事务,则新建一个事务

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值