Spirng的事务传播

总结:

方法A调用方法B:
  • 如果A和B方法在同一个类中:
    如果A加@Transactional注解,B加不加@Transactional注解,事务是有效的,则AB在同一事务中。
    如果A不加@Transactional注解,B加不加@Transactional注解,事务都是无效的。

  • 如果A和B不在同一个类中:
    如果A加@Transactional注解,B加不加@Transactional注解,事务是有效的。
    如果A不加@Transactional注解,B加了@Transactional注解,只有B是有事务的;
    如果A不加@Transactional注解,B不加@Transactional注解,A、B都是没有事务的。

或者这样理解

  1. 如果A加@Transactional注解,不管是不是在一个类中,不管B加不加注解,AB都是在同一事务中;
  2. 如果A不加@Transactional注解,只有B加@Transactional注解,AB方法为同一类,事务失效;AB不同类,只有B有事务;
  3. 如果A不加@Transactional注解,B不加@Transactional注解,则没有事务;

原因:A方法上有@Transactional注解,spring在管理的时候,会生成一个代理类,真正调用到A方法时,实际执行的是代理类里面的方法,该代理类里面的方法已经包括了B方法的调用,已经成为了一个方法。所以事务是有效的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring事务传播是指在多个具有事务控制的service相互用时所形成的复杂事务边界控制。Spring提供了七种事务传播行为,分别是: 1. REQUIRED(默认):表示当前方法必须在一个具有事务的上下文运行,如果客户端有事务在进行,那么被用端将在该事务运行,否则重新开启一个事务。如果被用端发生异常,用端和被用端事务都将回滚。 2. SUPPORTS:表示当前方法可以在一个具有事务的上下文运行,也可以在没有事务的上下文运行。 3. MANDATORY:表示当前方法必须在一个具有事务的上下文运行,如果没有事务则抛出异常。 4. REQUIRES_NEW:表示当前方法必须运行在它自己的事务。一个新的事务将启动,如果有现有的事务在运行,则该方法被挂起,直到新的事务提交或回滚才恢复执行。 5. NOT_SUPPORTED:表示当前方法不应该运行在一个事务,如果有事务在运行,则将该事务挂起,直到方法执行完毕。 6. NEVER:表示当前方法不应该运行在一个事务,如果有事务在运行,则抛出异常。 7. NESTED:表示如果当前方法正有一个事务在运行,则该方法应该运行在一个嵌套事务。被嵌套的事务可以独立于封装事务进行提交或回滚。如果封装事务存在,并且外层事务回滚,那么内层事务必须回滚,反之,内层事务不影响外层事务。如果封装事务不存在,则与REQUIRED相同。 这些事务传播行为可以根据具体的业务需求来选择,以实现正确的事务控制。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值