Spring事务传播机制

public void A(a) {
    insertAtoTable(a);
}

public void B(b) {
    insertBtoTable(b);
}

1.required:如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务

@Transactional(propagation = Propagation.REQUIRED)
public void testMain() {

    A(a);
    testb();
}

@Transactional(propagation = Propagation.REQUIRED)
pubic void testb() {

    B(b1);
    throw new Exception();
    B(b2)
}

结果:因为testMain()存在事务,所以执行testb()时就会加入该事务,因此AB是同一事务,发生异常后回滚。都没有插入成功


public void testMain() {

    A(a);
    testb();
}

@Transactional(propagation = Propagation.REQUIRED)
pubic void testb() {

    B(b1);
    throw new Exception();
    B(b2)
}

结果:a更新成功,b1,b2更新失败.由于testMain()中没有声明事务,,testb有声明事务,且传播机制是REQUIRED,所以在执行testb时会新建一个事务,该事务发生了回滚。但a不会回滚

SUPPORTS:当前存在事务,则加入该事务,如果没有就以非事务方式执行。


public void testMain() {

    A(a);
    testb();
}

@Transactional(propagation = Propagation.SUPPORT)
pubic void testb() {

    B(b1);
    throw new Exception();
    B(b2)
}

结果:a,b1更新成功,b2更新失败,因为当前不存在事务,所以以非事务方式执行。

MANDATORY:当前存在事务,则加入该事务,如果当前事务不存在,则抛出异常。

public void testMain() {

    A(a);
    testb();
}

@Transactional(propagation = Propagation.MANDATORY)
pubic void testb() {

    B(b1);
    throw new Exception();
    B(b2)
}

结果:a更新成功,b1,b2失败,因为运行到该方法时就报错了,不存在事务回滚。

REQUIRES_NEW:创建一个新事务,如果存在当前事务,则挂起该事务

@Transactional(propagation = Propagation.REQUIRED)
public void testMain() {

    A(a);
    testb();
    throw new Exception();
}

@Transactional(propagation = Propagation.REQUIRED_NEW)
pubic void testb() {

    B(b1);
    B(b2)
}

结果:a没有存储成功,b1,b2存储成功,testb会开启一个新的事务,testMain中事务会发生回滚,两个事务互不影响。

如果两个都是REQUIRED,a,b1,b2都会更新失败,因为只有一个事务,并且发生异常.

NOT_SUPPORTED:始终以非事务方式进行,如果当前有事务,则挂起

@Transactional(propagation = Propagation.REQUIRED)
public void testMain() {

    A(a);
    testb();
   
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
pubic void testb() {

    B(b1);
     throw new Exception();
    B(b2)
}

结果:a,b2没有更新成功,b1存储成功,因为b没有事务,所以b1存储成功,但是b1抛出了异常,影响了a事务,因此a回滚,没有更新成功

NEVER:不使用事务,如果当前存在抛出异常,不仅我这个方法不允许使用事务,并且调用我的方法也不允许存在事务,如果调用我的方法存在事务,抛出异常

NESTED:如果当前存在事务,则以嵌套事务方式执行,如果不存在事务,则创建一个新的事务。嵌套事务是一种特殊事务,独立于外部事务进行回滚,但提交仍依赖于外部事务。这种传播行为适用于需要在单个事务内执行多个独立操作的场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值