自己遇到的事务失效情况 (直接调用的意思是this.B()的形式或者B()形式调用)
同一个类中
1、A方法没有加事务,B方法加了事务,在A方法直接调用B方法,B方法出现异常了,B方法不会回滚
原因:spring在扫描包的时候会扫描到@Transactional注解的方法,spring的回滚是用过代理模式生成的,如果是一个不带事务的方法调用该类的带事务的方法,直接通过this.xxx()
调用,而不生成代理事务,所以事务不起作用
2、a方法默认传播行为即Propagation.REQUIRED,b方法propagation = Propagation.REQUIRES_NEW传播行为 ,a方法和b方法都有事务,在a方法直接调用b方法,在a中将b的异常捕获了,b方法没有回滚
原因:虽然spring可以将这两个方法的注解扫描到产生代理对象,但是在A方法中直接调用B方法,调用方法是真实对象调用的,而不是代理对象调用的,所以B方法的事务是失效的,事务不不会回滚
解决方法可以在类中将本类装配进来,用装配进来的对象调用B方法
例如
@Autowired
private UserLoginService userLoginService;
userLoginService.B()
补充:
方法a上有事务,但在方法a没有增删改操作,方法b没有事务,在方法b里有增删改操作 (方法a执行结束后事务才会提交或者回滚)
场景:方法a调用方法b,当b有异常,b会回滚;(这里不管是直接调用即b()或者this.b() 还是用service.b() 调用数据库都会回滚)
场景:方法a调用方法b,当a有异常,b会回滚;(这里不管是直接调用即b()或者this.b() 还是用service.b() 调用数据库都会回滚)
方法a上没有事务,方法b也没有事务,在方法b里有增删改操作
场景:方法a调用方法b,b操作数据库语句一结束,数据就会更新,后续当b有异常,b不会回滚;(这里不管是直接调用即b()或者this.b() 还是用service.b() 调用数据库都不会回滚)