遇到了一个如题说描述的,在B方法调用其他方法A时,账户加积分,如果报错则抛异常;在B方法中,账户减积分;
结果A抛异常后,B仍然减了积分,不回滚!!!
1. 排查问题时,方法上主键做如下调整:@Transactional(rollbackFor=Exception.class),问题得到解决。
说明:
Spring框架的事务管理默认地只在发生RuntimeException和Error时才进行事务回滚。也就是说,当事务方法抛出Exception中除了RuntimeException及其子类以外的异常时不会进行事务回滚。
在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。
在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚