事务的传播特性

事务的传播特性指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行?
spring的事务传播行为一共有7种:默认传播属性是REQUIRED

假设1号事务去调用,2号事务和3号事务(2,3事务在同一个类当中)

**REQUIRED:如果当前没有事务,创建一个新的事务,如果有事务就加入到事务中**1号事务加了@Transactional,即使2号事务异常被捕获还是会进行回滚操作。
2号事务加了@Transactional(propagation = Propagation.REQUIRED) ,并且出现了异常,
3号事务加了@Transactional(propagation = Propagation.REQUIRED) ,没有异常,
3号事务会进行回滚操作。
**REQUIRES_NEW:无论当前存不存在事务,都创建一个新的事务执行**1号事务加了@Transactional2号事务加了@Transactional(propagation = Propagation.REQUIRES_NEW) ,并且出现了异常,
3号事务加了@Transactional(propagation = Propagation.REQUIRES_NEW),没有异常,
3号事务不会进行回滚操作。

当1号事务加了@Transactional,并捕获了2号事务的异常
2号事务加了@Transactional(propagation = Propagation.REQUIRES_NEW) ,并且出现了异常,
3号事务加了@Transactional,没有异常,
3号事务不会进行回滚操作。

当1号事务加了@Transactional,并且出现了异常
2号事务加了@Transactional(propagation = Propagation.REQUIRES_NEW) ,没有异常
3号事务加了@Transactional,没有异常,
2号事务不会进行回滚操作。
SUPPORTS:如果当前存在事务,就加入到改事务当中,如果不存在事务,就以非事务的方式运行
当2号事务加了@Transactional(propagation = Propagation.SUPPORTS)并且出现了异常。
而1号事务(主事务)没有加@Transactional,那么2号事务就不会进行回滚操作。
NOT_SUPPORTED:
当2号事务加了@Transactional(propagation = Propagation.NOT_SUPPORTS)出现异常。
1号事务(主事务)即使加了@Transactional,也不会进行回滚操作。
NEVER:当前的方法不应该运行在事务中(不能有@Transactional)如果有就会抛出异常。
MANDATORY:当前的方法必须运行在事务中(必须有@Transactional)否则就会抛出异常
NESTED:
当1号事务加了@Transactional,并把2号事务的异常捕获了
2号事务加了@Transactional(propagation = Propagation.NESTED),并且出现了异常,
3号事务加了@Transactional,没有异常,
3号事务不会进行回滚操作。(这和REQUIRED的区别)

当1号事务加了@Transactional,出现了异常
2号事务加了@Transactional(propagation = Propagation.NESTED),没有异常
3号事务加了@Transactional,没有异常,
2号事务会进行回滚操作。(这和REQUIRES_NEW的区别)

如果在bookservice执行的话,会发现刚刚的效果就没有了,原因是外层调用的时候使用的AOP,但是本类方法自己的调用就是最最普通的调用,就是同一个事务。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值