spring 事务失效的几种场景
2024-09-05 15:57:54
以下场景是基于mysql数据库,InnoDB的存储引擎。
一.没有添加@Transactional注解
二.方法声明是private或者static
三.没有抛出异常而是try catch了异常
下面这种情况,事务不会回滚
@Transactional
public void insertUser(String name){
try {
User user = new User();
user.setName(name);
userDao.insertUser(user);
//模拟抛异常
throw new RuntimeException();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
四.异常类型不对
默认只对runtimeException的类型进行回滚,如果抛出Exception异常是不进行回滚的,如果想回滚要配置@Transactional(rollbackFor = Exception.class)
@Transactional
public void insertUser(String name) throws Exception {
User user = new User();
user.setName(name);
userDao.insertUser(user);
//模拟抛异常
throw new Exception();
}
五.自己调自己
下面这种情况,事务是不生效的,如果要生效,可以把this调用放到另外一个类,insertStu这个放另外一个类,这样可以这个方法有事务
public void insertUser(String name) {
User user = new User();
user.setName(name);
//没有事务,不会回滚,保存成功
userDao.insertUser(user);
insertStu(name);
}
@Transactional
public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
//没有事务,保存会成功
stuDao.insertUser(stu);
throw new RuntimeException();
}
下面这种情况,事务是生效的,注意
@Transactional
public void insertUser(String name) {
User user = new User();
user.setName(name);
//有事务,会回滚,保存不成功
userDao.insertUser(user);
insertStu(name);
}
public void insertStu(String name){
Stu stu = new Stu();
stu.setName(name);
//有事务,会回滚,保存不成功
stuDao.insertUser(stu);
throw new RuntimeException();
}
六.没有配置正确的事务管理器
如果项目中是多数据源情况,要单独配置事务管理器。当引入jdbc依赖之后,Spring Boot会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager,
所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。
最新文章
- Unix及类Unix系统文本编辑器的介绍
- ios几个重要方法
- HDU 2545 树上战争 (并查集+YY)
- LigerUi框架+jquery+ajax无刷新留言板系统的实现
- Java性能优化权威指南-读书笔记(五)-JVM性能调优-吞吐量
- Mongoose 是什么?
- UITapGestureRecognizer 的用法
- day-7
- c++11 auto
- cocos2dx定时器
- linux 配置 mail server
- java字符编码,字符转码
- day01_HTML
- git常用命令,学git代码管理
- webuploader 上传文件 生成链接下载文件
- CPM、CPC、CPA、CPS、CPL、CPR 是什么意思 -解析互联网广告术语
- 《BUG创造队》第二次团队作业:团队项目选题报告
- 盘点海口最好吃的西餐厅top10
- 转:日志插件 log4net 的使用
- [No0000F9]C# 运算符重载
热门文章
- Django中的常用字段类型与参数
- CF116B Little Pigs and Wolves 题解
- CF1481B New Colony 题解
- CF1154A Restoring Three Numbers 题解
- JAVA运行报错 [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
- c++之记一次常见数据类型在fedora和wind10下所占的长度
- 如何让 Spring Security 「少管闲事」
- Java练习小题_猴子吃桃问题分别用for循环和while循环实现程序。
- 【MySQL作业】avg 和 count 函数——美和易思聚合函数应用习题
- 智慧巨鹿使用Rainbond落地实践,一个平台管理所有应用系统