@Transactional使用
转: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使用相关推荐
- @Transactional注解最容易忽视的三个失效场景!
@Transactional注解在以下场景中使用,是会失效的,切记! 1.非public方法 spring对注解事务的方法进行校验,修饰符是不是public,不是 public则不会获取@Transa ...
- 3 种场景 @Transactional 失效的解决方法
以下文章来源方志朋的博客,回复"666"获面试宝典 来源 | blog.csdn.net/qq_20597727/article/details/84900994 Transact ...
- Spring官方都推荐使用的@Transactional事务,为啥我不建议使用!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 事务管理在系统开发中是不可缺少的一部分,Spring提供了 ...
- @aspect注解类不生效_springboot:@Transactional注解 VS @Service注解
1. Transactional注解与Service/Component注解冲突? 之前遇到一个神奇的事情--用Transactional注解的方法,数据处理了一半,后面的数据处理抛出异常后,没有回滚 ...
- Spring Transactional还能导致生产事故?
在Spring中进行事务管理非常简单,只需要在方法上加上注解@Transactional,Spring就可以自动帮我们进行事务的开启.提交.回滚操作.甚至很多人心里已经将Spring事务与@Trans ...
- 一口气说出 6 种 @Transactional 注解的失效场景
一.事务 事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 编程式事务:是指在代码中手动的管理事务的提交.回滚等操作,代码侵入性比较强, ...
- Spring_Spring@Transactional
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...
- Spring 事务之@Transactional
在业务代码中,有如下两种情况,比如: throw new RuntimeException("xxxxxxxxxxxx"); 事务回滚 throw new Exception(&q ...
- spring@Transactional注解事务不回滚不起作用无效的问题处理
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactio ...
- SpringBoot之事务管理Transactional
以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来保证一致性,即service方法里的多个dao操作,要 ...
最新文章
- Win8Metro(C#)数字图像处理--2.3图像反色
- java版spring cloud+spring boot+redis社交电子商务平台(四)SpringBoot 整合JPA
- TabHost中使用startActivityForResult无法接收返回值的解决方案
- CUDA安装及配置:Windows 7 64位环境
- easyUI的引用顺序
- oracle 代码 字段映射,将ORACLE TIMESTAMP(9)字段映射到java.util.Date
- Oracle 原理:序列
- Caffe阅读代码并修改
- strchr函数的用法
- 双向链表(不带头结点)
- 跟随报文,开启一段奇妙之旅
- 快手宣布任命金秉为首席财务官 向程一笑汇报
- [考试]20150903
- Windows XP默认用户自动登录
- 184_刘发顺_Java核心编程
- git 拉取指定分支
- 公司尽然把cnblogs给屏蔽了,可恶!!!
- Hugegraph合集(一):图数据库技术调研
- 2020,AI创业与投资进入“深水区”
- python:实现roman numerals罗马数字算法(附完整源码)
热门文章
- win7计算机启动修复,win7启动修复功能无法正常进入系统的解决方法
- Python多值函数
- MDM市场诸侯混战,烽火发布MobileArk战略布局
- Linux替换Docker镜像源
- opencv 中函数的一相关说明,如:cvtColor和cvCvtColor区别
- 异构数据库中间件sequoia(c-jdbc)初体验(1.安装试运行)
- http://nian.so/#网站的拓展工具编写
- Python各个版本特性
- 如何正确选择python的版本
- Maximum Absurdity(dp思想+前缀和)