事务的传播机制

一、为什么会有传播机制

spring 对事务的控制,是使用 aop 切面实现的,我们不用关心事务的开始,提交 ,回滚,只需要在方法上加 @Transactional 注解,这时候就有问题了。

  • 场景一: serviceA 方法调用了 serviceB 方法,但两个方法都有事务,这个时候如果 serviceB 方法异常,是让 serviceB 方法提交,还是两个一起回滚。
  • 场景二:serviceA 方法调用了 serviceB 方法,但是只有 serviceA 方法加了事务,是否把 serviceB 也加入 serviceA 的事务,如果 serviceB 异常,是否回滚 serviceA 。
  • 场景三:serviceA 方法调用了 serviceB 方法,两者都有事务,serviceB 已经正常执行完,但 serviceA 异常,是否需要回滚 serviceB 的数据。

二、传播机制生效条件

因为 spring 是使用 aop 来代理事务控制 ,是针对于接口或类的,所以在同一个 service 类中两个方法的调用,传播机制是不生效的

三、传播机制类型

Spring它对JDBC的隔离级别作出了补充和扩展,其提供了7种事务传播行为。
下面的类型都是针对于被调用方法来说的,理解起来要想象成两个 service 方法的调用才可以。

1.REQUIRED(默认):
  • 支持当前事务,如果当前没有事务,则新建事务
  • 如果当前存在事务,则加入当前事务,合并成一个事务
2.SUPPORTS:
  • 如果当前存在事务,则加入事务
  • 如果当前不存在事务,则以非事务方式运行,这个和不写没区别
3.MANDATORY:
  • 如果当前存在事务,则运行在当前事务中
  • 如果当前无事务,则抛出异常,也即父级方法必须有事务
4.REQUIRES_NEW:
  • 新建事务,如果当前存在事务,则把当前事务挂起
  • 这个方法会独立提交事务,不受调用者的事务影响,父级异常,它也是正常提交
5.NOT_SUPPORTED:
  • 以非事务方式运行
  • 如果当前存在事务,则把当前事务挂起
6.NEVER:
  • 以非事务方式运行,如果当前存在事务,则抛出异常,即父级方法必须无事务
7.NESTED:
  • 如果当前存在事务,它将会成为父级事务的一个子事务,方法结束后并没有提交,只有等父事务结束才提交
  • 如果当前没有事务,则新建事务,与REQUIRED类似的操作。
  • 如果它异常,父级可以捕获它的异常而不进行回滚,正常提交
  • 但如果父级异常,它必然回滚,这就是和REQUIRES_NEW的区别

        REQUIRES_NEW启动一个新的,不依赖于环境的"内部"事务.这个事务将被完全commited或rolledback而不依赖于外部事务,它拥有自己的隔离范围,自己的锁,等等.当内部事务开始执行时,外部事务将被挂起,内务事务结束时,外部事务将继续执行.
        另一方面,NESTED开始一个"嵌套的"事务,它是已经存在事务的一个真正的子事务.潜套事务开始执行时,它将取得一个savepoint.如果这个嵌套事务失败,我们将回滚到此savepoint.潜套事务是外部事务的一部分,只有外部事务结束后它才会被提交.
        由此可见,REQUIRES_NEW和NESTED的最大区别在于,REQUIRES_NEW完全是一个新的事务,而NESTED则是外部事务的子事务,如果外部事务commit,潜套事务也会被commit,这个规则同样适用于rollback.

四、注意事项:

1.@Transactional注释只能作用于public方法上,其他修饰将被忽略。
2.如果在接口,类,和方法上都指定了@Transactional注释,则优先级为方法->类->接口
3.建议只在类上加@Transactional注释,而不是接口上。
4.默认只会对unchecked异常进行回滚,最常见的为RuntimeException及其各种子类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值