转: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. Win8Metro(C#)数字图像处理--2.3图像反色
  2. java版spring cloud+spring boot+redis社交电子商务平台(四)SpringBoot 整合JPA
  3. TabHost中使用startActivityForResult无法接收返回值的解决方案
  4. CUDA安装及配置:Windows 7 64位环境
  5. easyUI的引用顺序
  6. oracle 代码 字段映射,将ORACLE TIMESTAMP(9)字段映射到java.util.Date
  7. Oracle 原理:序列
  8. Caffe阅读代码并修改
  9. strchr函数的用法
  10. 双向链表(不带头结点)
  11. 跟随报文,开启一段奇妙之旅
  12. 快手宣布任命金秉为首席财务官 向程一笑汇报
  13. [考试]20150903
  14. Windows XP默认用户自动登录
  15. 184_刘发顺_Java核心编程
  16. git 拉取指定分支
  17. 公司尽然把cnblogs给屏蔽了,可恶!!!
  18. Hugegraph合集(一):图数据库技术调研
  19. 2020,AI创业与投资进入“深水区”
  20. python:实现roman numerals罗马数字算法(附完整源码)

热门文章

  1. win7计算机启动修复,win7启动修复功能无法正常进入系统的解决方法
  2. Python多值函数
  3. MDM市场诸侯混战,烽火发布MobileArk战略布局
  4. Linux替换Docker镜像源
  5. opencv 中函数的一相关说明,如:cvtColor和cvCvtColor区别
  6. 异构数据库中间件sequoia(c-jdbc)初体验(1.安装试运行)
  7. http://nian.so/#网站的拓展工具编写
  8. Python各个版本特性
  9. 如何正确选择python的版本
  10. Maximum Absurdity(dp思想+前缀和)