@Transactional 注解的方法之间调用,事务是否生效及
作者:
十二找十三 | 来源:发表于
2022-10-25 14:41 被阅读0次首先,我们需要知道,Spring是通过代理管理事务的,方法和方法之间的调用分为两种情况:
1.不同类之间的方法调用: (例如类A的方法a()调用类B的方法b)
如果是在A的方法a()上加@Transactional注解,那么先正常调用b()且b()有增删改操作,但是接着执行a()的动库操作异常,则两个方法内动库操作全部回滚;
如果A的方法a()没加@Transactional注解,而类B的方法b()上加了该注解,那么如果先正常执行中a()的数据库操作,然后执行类B的方法b()的动库操作发生异常,那么b()中的事务操作会全部回滚,但是并不会影响先前a()中的操作,即b()中异常b()回滚,a()不回滚。
总结: 不同类之间调用(类A的方法a()调用类B的方法b())
1).a()和b()都有注解肯定那个有异常a()和b()都事务生效
2).a()有注解b()没有注解(注意前提a()调用b())==> a()异常/b()异常:a()和b()都事务生效
3).a()没有注解b()有注解(注意前提a()调用b())==>
3.1 a()异常在b()方法前 a()的事务不生效 b()的生效; a()异常在b()方法后 a()和b()都事务都不生效
3.2 b()异常在a()方法前 a()的事务生效 b()的生效; b()异常在a()方法后 a()的事务不生效 b()的生效;
最终总结一句话: 有注解肯定生效 但是传递性按顺序处理
2.同一个类的不同方法之间的调用:(例如同类中方法a()调用方法b())
1).方法a()开启了事务,事务正常生效
2).方法a()没有开启事务,此时调用方法b(),无论被调用的b()是否配置了事务,事务都不会生效
说明: 在微服务架构中,很多方法里面会有各种跨库操作,这时候你添加注解@Transactional就不会使事务生效了,我们通常会寻求Seata等其他技术方案解决分布式事务问题。
另外,使用@Transactional注解的时候,需要注意:
1.如果在该注解标注的方法或被其调用的方法中有try catch,那么想要使得事务生效,一定要在catch中把异常直接抛出,如果不处理不向上抛出,则事务不会生效。
2.@Transactional只能回滚RuntimeException和RuntimeException下面的子类抛出的异常 不能回滚Exception异常!!!如果需要支持回滚Exception异常请用@Transactional(rollbackFor = Exception.class),如果是增删改的时候我建议大家都使用@Transactional(rollbackFor = Exception.class)。
本文标题:@Transactional 注解的方法之间调用,事务是否生效及
本文链接:https://www.haomeiwen.com/subject/duznzrtx.html
网友评论