你的Spring事务为什么不会自动回滚

2021-11-18 From 程序之心 By 丁仪

Spring事务回滚机制是这样的:当所拦截的方法有指定异常抛出,事务才会自动进行回滚!

  1. 被拦截方法-—— 注解式:方法或者方法所在类被@Transactional注解;
  2. 异常—— 该方法的执行过程必须出现异常,这样事务管理器才能被触发,并对此做出处理
  3. 指定异常—— 默认配置下,事务只会对Error与RuntimeException及其子类这些UNChecked异常,做出回滚。一般的Exception这些Checked异常不会发生回滚(如果一般Exception想回滚要做出配置);

执行方法的时候出现了SQL执行的Exception事务还是发生了回滚,是因为Spring框架下,所有SQL异常都被org.springframework重写为RuntimeException!

还有一点当这个方法上加了@Transaction(此处是默认的传播行为)注解,当这个方法抛出RuntimeException之后被try catch之后声明式事务是不会感知的,当然也不会回滚,但是当在另一个也有事务的方法内调用了这个方法,形成嵌套事务,这个方法抛出了RuntimeException之后在上层方法内try catch的话,则上层方法的整个事务会被回滚。

本文来源:程序之心,转载请注明出处!

本文地址:https://chengxuzhixin.com/blog/article/300495.html

发表感想

© 2016 - 2022 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号