@Transactional(rollbackFor)
@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中间接调用的方法不会触发事务
@Transactional(rollbackFor)的更多相关文章
- spring的@Transactional(rollbackFor=Exception.class)的使用
Spring框架的事务基础架构代码将默认地只在抛出运行时和unchecked exceptions时才标识事务回滚. 也就是说,当抛出个RuntimeException 或其子类例的实例时.(Erro ...
- 注解@Transactional(rollbackFor = Exception.class) 的用法
由于业务需求要求,在一个Service的一个方法A中有一个for循环,每次循环里面的业务逻辑有可能发生异常,这个时候就需要将这个循环内的所有数据库操作给回滚掉,但是又不能影响到之前循环里数据的更改,并 ...
- Spring中的@Transactional(rollbackFor = Exception.class)属性详解
序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法: 异常 如下图所示,我们都 ...
- Spring中@Transactional(rollbackFor = Exception.class)的作用
Spring中的@Transactional(rollbackFor = Exception.class)事务处理,当你的方法中抛出异常时,它会将 事务回滚,数据库中的数据将不会改变,也就是回到进入此 ...
- @Transactional(rollbackFor = Exception.class)
@Transactional(rollbackFor = Exception.class)这个注解只有在出异常时才会回滚,需要回滚时没有异常也要人为制造异常(自定义异常)所以,如果使用了异常捕获,很有 ...
- @Transactional(rollbackFor=Exception.class)的使用
转载: java阿里巴巴规范提示:方法[edit]需要在Transactional注解指定rollbackFor或者在方法中显示的rollback. 先来看看异常的分类 error是一定会回滚的 这里 ...
- @Transactional(rollbackFor=Exception.class)的作用
在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方 法抛出异常,就会回滚,数据库里面的数据也会回滚. 这种设置是因 ...
- coding++:Spring中的@Transactional(rollbackFor = Exception.class)属性详解
异常: 如下图所示,我们都知道 Exception 分为 运行时异常 RuntimeException 和 非运行时异常. error 是一定会回滚的. 如果不对运行时异常进行处理,那么出现运行时异常 ...
- 一次Spring Transactional嵌套事务使用不同的rollbackFor的分析
起因: 项目期间由于一次异常回滚问题,发现自己在事务知识方面知识的遗漏,趁着这次机会,做了几次rollbackFor的测试. 测试: 现在有两个事务,事务oute包含事务Inner.事务A回滚规则 ...
随机推荐
- ThreadPoolExecutor源码2
public class ThreadPoolExecutor1 extends AbstractExecutorService1 { // 11100000000000000000000000000 ...
- 根据jdk1.8源码整理而得,java集合体系(继承、实现关系)图解,超清晰,一看就懂,方便记忆
一.前言 1. 该关系图是本人根据JDK1.8 源码整理所得,只整理了常用的.常见的集合,并非全部. 2. 整理逻辑: Collection接口下有两个子接口:List 和 Set 接口. Map是独 ...
- Android工具使用之UiAutomatorViewer
学习博客: https://blog.csdn.net/l403040463/article/details/79235670 使用, 添加web 网页的监控.
- 如何解决Requests的SSLError(转)
add by zhj: 我使用方法2“更新系统的certificate”解决了问题 原文:https://www.jianshu.com/p/8deb13738d2c 这两天在Linux上爬Googl ...
- Java 加载动态库 dll 文件
不知道具体原理,但是,加载 dll 文件时,带路径或者更改 dll 文件的名字,都会报错.虽然库记载成功了,但是处女座认为这不可接受.于是有了这个解决方案. 在根目录为库创建软连接,然后使用 syst ...
- 在window中安装Docker,并生成CentOS镜像
下载并安装windows docker 修改镜像本地保存地址
- Java Mockito 笔记
Mockito 1 Overview 2 Maven 项目初始化 3 示例 3.1 第一个示例 3.2 自动 Mock 3.3 Mock 返回值 3.4 Mock 参数 3.5 自动注入 Mock 对 ...
- 第二章 Maven 构建 Java Web项目
本教程中,我们将教给大家如何创建一个基于Spring MVC 的 Maven Web Project. 用到的技术/工具: 1.Eclipse 4.9 2.Maven 3.6.2 3.Tomcat 8 ...
- Java自学-日期 Date
Java的日期类Date Date类 注意:是java.util.Date; 而非 java.sql.Date,此类是给数据库访问的时候使用的 示例 1 : 时间原点概念 所有的数据类型,无论是整数, ...
- 记一次Spring boot集成mybatis错误修复过程 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
最近自己写了一份代码签入到github,然后拉下来运行报下面的错误 Error starting ApplicationContext. To display the conditions repor ...