转:https://www.jianshu.com/p/9098372c108a
@Transactional(rollbackFor)

概括
@Transactional注解有两个,一个是spring提供的@org.springframework.transaction.annotation.Transactional 另一个是jdk提供@javax.transaction.Transactional。在回滚的设置上,spring提供的是rollbackFor,jdk提供的是rollbackOn,在使用方法上是一致的。
这两个注解在我有限的测试里表现是一样的。

用在哪里
@Transactional注解既可以写在方法上也可以写在类上。写在类上则这个类的所有public方法都将会有事务。这样显然会使一些不需要事务的方法产生事务,所以更好的做法是在想要添加事务的方法上标注@Transactional。

rollbackFor
@Transactional的rollbackFor用于指定能够触发事务回滚的异常类型,可以指定多个,用逗号分隔。
rollbackFor默认值为UncheckedException,包括了RuntimeException和Error.
当我们直接使用@Transactional不指定rollbackFor时,Exception及其子类都不会触发回滚。

public class BusinessException extends Exception {
public BusinessException(String msg) {
super(msg);
}
}

@Autowired
private UserRepository userRepository;// 不回滚
@Transactional
public void test1() throws Exception {User user = new User(1, "15000000000", "d243ewa", "Comma");saveUser(user);throw new Exception("test1 error");
}// 不回滚
@Transactional
public void test11() throws Exception {User user = new User(1, "15000000000", "d243ewa", "Comma");saveUser(user);throw new BusinessException("test11 error");
}// 回滚
@Transactional(rollbackOn = Exception.class)
public void test2() throws Exception {User user = new User(1, "15000000000", "d243ewa", "Comma");saveUser(user);throw new Exception("test2 error");
}// 回滚
@Transactional(rollbackOn = Exception.class)
public void test21() throws Exception {User user = new User(1, "15000000000", "d243ewa", "Comma");saveUser(user);throw new BusinessException("test21 error");
}// 回滚
@Transactional
public void test3() {User user = new User(1, "15000000000", "d243ewa", "Comma");saveUser(user);throw new RuntimeException("test3 runtime error");
}// 不回滚
@Transactional
public void test4() throws Exception {User user = new User(1, "15000000000", "d243ewa", "Comma");test41(user);throw new Exception("test4 error");
}@Transactional(rollbackOn = Exception.class)
public void test41(User user) {saveUser(user);
}// 不回滚
public void test5() throws BusinessException {test6();
}// 回滚
@Transactional(rollbackOn = Exception.class)
public void test6() throws BusinessException {User user = new User(1, "15000000000", "d243ewa", "Comma");saveUser(user);throw new BusinessException("test6 error");
}// 回滚
@Transactional(rollbackOn = Exception.class)
public void test7() throws BusinessException {test8();
}public void test8() throws BusinessException {User user = new User(1, "15000000000", "d243ewa", "Comma");saveUser(user);throw new BusinessException("test8 error");
}public User saveUser(User user) {return userRepository.save(user);
}

有一点需要注意,在service中间接调用的方法不会触发事务,具体可以看下这篇文章https://zhuanlan.zhihu.com/p/38208248 ,感谢作者的详细讲述。

@Transactional使用相关推荐

  1. @Transactional注解最容易忽视的三个失效场景!

    @Transactional注解在以下场景中使用,是会失效的,切记! 1.非public方法 spring对注解事务的方法进行校验,修饰符是不是public,不是 public则不会获取@Transa ...

  2. 3 种场景 @Transactional 失效的解决方法

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源 | blog.csdn.net/qq_20597727/article/details/84900994 Transact ...

  3. Spring官方都推荐使用的@Transactional事务,为啥我不建议使用!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 事务管理在系统开发中是不可缺少的一部分,Spring提供了 ...

  4. @aspect注解类不生效_springboot:@Transactional注解 VS @Service注解

    1. Transactional注解与Service/Component注解冲突? 之前遇到一个神奇的事情--用Transactional注解的方法,数据处理了一半,后面的数据处理抛出异常后,没有回滚 ...

  5. Spring Transactional还能导致生产事故?

    在Spring中进行事务管理非常简单,只需要在方法上加上注解@Transactional,Spring就可以自动帮我们进行事务的开启.提交.回滚操作.甚至很多人心里已经将Spring事务与@Trans ...

  6. 一口气说出 6 种 @Transactional 注解的失效场景

    一.事务 事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 编程式事务:是指在代码中手动的管理事务的提交.回滚等操作,代码侵入性比较强, ...

  7. Spring_Spring@Transactional

    Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...

  8. Spring 事务之@Transactional

    在业务代码中,有如下两种情况,比如: throw new RuntimeException("xxxxxxxxxxxx"); 事务回滚 throw new Exception(&q ...

  9. spring@Transactional注解事务不回滚不起作用无效的问题处理

    这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactio ...

  10. SpringBoot之事务管理Transactional

    以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来保证一致性,即service方法里的多个dao操作,要 ...

最新文章

  1. Win7封装无损廋身清单
  2. C语言二维数组的指针写法
  3. C语言实验——拍皮球_JAVA
  4. c语言数据结构-算法篇之选择排序
  5. U盘文件名称变成乱码的解决方法
  6. Django静态文件小结
  7. 602B. Approximating a Constant Range
  8. powerdesigner mysql 自增主键_PowerDesigner Mysql 主键自增、初始值、字符集
  9. UITableView总忘记的
  10. AD账户频繁被锁定-开启日志审核策略
  11. 转载--批量更新数据(性能优化)
  12. open*** 跨平台部署
  13. 超好用的文件转换神器!拿走不谢~
  14. 大地高、正高和正常高及高程异常
  15. 深入理解操作系统原理之操作系统概述
  16. matlab三电平statcom无功检测双闭环svpwm调制两电平/三电平逆变器拓扑,pq无功电流检测模块
  17. 印度人为什么立刀切菜_印度人的刀功有多厉害?看到一刀刮掉的鱼鳞和碎洋葱,我彻底服了...
  18. win7默认网关不可用_win7 默认网关不可用
  19. 【Django BUG 已解决】You must either define the environment variable DJANGO_SETTINGS_MODULE or call ...
  20. Android S 默认WIFi 热点名称

热门文章

  1. 二维点云拉普拉斯深度平滑算法-matlab
  2. php函数 去空格,php删除空格函数是什么
  3. 关于影视剪辑中的pr软件你了解多少?
  4. 六旋翼无人机动力学建模与仿真搭建
  5. java 初始化object_Java对象初始化详解
  6. #计划# 机器视觉 #视觉增强 #python #数据库 #算法 #深度学习 #迁移学习 #matlab #数据融合
  7. 树莓派用transmission搭建bt下载机
  8. linux与unix区别
  9. 金蝶EAS,查询分析器,分页查询,获取6500行之后的记录
  10. 2.3 OSI参考模型