@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操作,要 ...
最新文章
- Win7封装无损廋身清单
- C语言二维数组的指针写法
- C语言实验——拍皮球_JAVA
- c语言数据结构-算法篇之选择排序
- U盘文件名称变成乱码的解决方法
- Django静态文件小结
- 602B. Approximating a Constant Range
- powerdesigner mysql 自增主键_PowerDesigner Mysql 主键自增、初始值、字符集
- UITableView总忘记的
- AD账户频繁被锁定-开启日志审核策略
- 转载--批量更新数据(性能优化)
- open*** 跨平台部署
- 超好用的文件转换神器!拿走不谢~
- 大地高、正高和正常高及高程异常
- 深入理解操作系统原理之操作系统概述
- matlab三电平statcom无功检测双闭环svpwm调制两电平/三电平逆变器拓扑,pq无功电流检测模块
- 印度人为什么立刀切菜_印度人的刀功有多厉害?看到一刀刮掉的鱼鳞和碎洋葱,我彻底服了...
- win7默认网关不可用_win7 默认网关不可用
- 【Django BUG 已解决】You must either define the environment variable DJANGO_SETTINGS_MODULE or call ...
- Android S 默认WIFi 热点名称
热门文章
- 二维点云拉普拉斯深度平滑算法-matlab
- php函数 去空格,php删除空格函数是什么
- 关于影视剪辑中的pr软件你了解多少?
- 六旋翼无人机动力学建模与仿真搭建
- java 初始化object_Java对象初始化详解
- #计划# 机器视觉 #视觉增强 #python #数据库 #算法 #深度学习 #迁移学习 #matlab #数据融合
- 树莓派用transmission搭建bt下载机
- linux与unix区别
- 金蝶EAS,查询分析器,分页查询,获取6500行之后的记录
- 2.3 OSI参考模型