springboot2.X版本得@Transactional注解事务不回滚不起作用
参考文章 https://my.oschina.net/happyBKs/blog/1624482 https://blog.csdn.net/u011410529/article/details/54287307
基本涵盖了事务所有得解决方法
我得情况是 在一个service中的一个没有事务管理得方法,调用了一个有事务管理得方法,在这种情况下 spring容器是不知道,所以事务是不起作用的 。
类似这种 随手写的一个类似例子:
@Override
public String save(UserVo userVo) throws Exception {
User user =new User();
List<RoleUser> roleUser=user.getRoles();
BeanUtils.copyProperties(userVo,user);
return insertUserAndRole(user,roleUser) ? "保存成功":"保存失败";
}
@Override
@Transactional(rollbackFor = Exception.class)
public String insertUserAndRole(User user,List<RoleUser> roleUser) {
userMapper.insert(user);
userRoleMapper.insertBatch(roleUser);
return true;
}
添加用户没有报错 但角色用户报错的情况下 用户却已经添加到数据库里了 没有回滚,
这就是上面说的情况
为了避免这种情况 你就需要让spring容器知道你什么时候调用这个并且管理这个事务
解决办法:
创建一个springcontext类
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext context = null;
private SpringContextUtil() {
super();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
/**
* 根据名称获取bean
* @param beanName
* @return
*/
public static Object getBean(String beanName) {
return context.getBean(beanName);
}
/**
* 根据bean名称获取指定类型bean
* @param beanName bean名称
* @param clazz 返回的bean类型,若类型不匹配,将抛出异常
*/
public static <T> T getBean(String beanName, Class<T> clazz) {
return context.getBean(beanName, clazz);
}
/**
* 根据类型获取bean
* @param clazz
* @return
*/
public static <T> T getBean(Class<T> clazz) {
T t = null;
Map<String, T> map = context.getBeansOfType(clazz);
for (Map.Entry<String, T> entry : map.entrySet()) {
t = entry.getValue();
}
return t;
}
/**
* 是否包含bean
* @param beanName
* @return
*/
public static boolean containsBean(String beanName) {
return context.containsBean(beanName);
}
/**
* 是否是单例
* @param beanName
* @return
*/
public static boolean isSingleton(String beanName) {
return context.isSingleton(beanName);
}
/**
* bean的类型
* @param beanName
* @return
*/
public static Class getType(String beanName) {
return context.getType(beanName);
}
}
调用的时候用这个工具类,例如例子中的 insertUserAndRole(user,roleUser) ? "保存成功":"保存失败"; 修改为
SpringContextUtil.getBean(this.getClass()). insertUserAndRole(user,roleUser)? "保存成功":"保存失败";
---------------------
作者:提升自己的小白
来源:CSDN
原文:https://blog.csdn.net/weixin_42080277/article/details/86220280
版权声明:本文为博主原创文章,转载请附上博文链接!
springboot2.X版本得@Transactional注解事务不回滚不起作用的更多相关文章
- spring@Transactional注解事务不回滚不起作用无效的问题处理
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性先来了解一下@Transaction ...
- @Transactional注解事务不回滚不起作用无效
写在前面 数据库Mysql8.0 添加@Transactional注解后事务并未起作用. 修改表的引擎后ok了.(详看下面转载内容) ================================ ...
- spring + myBatis 常见错误:注解事务不回滚
最近项目在用springMVC+spring+myBatis框架,在配置事务的时候发现一个事务不能回滚的问题. 刚开始配置如下:springMVC.xml配置内容: spring.xml配置内容 从上 ...
- 关于SSM项目注解事务不回滚的问题
<!--扫描service包(包含子包)下所有使用注解的类型--> <context:component-scan base-package="com.song.ssm.s ...
- 记录一次Spring boot 搭建框架连接Mysql数据库注解事务不回滚的故障
搭建了一个新框架,使用了spring boot 替换以简化原来繁杂的spring配置,使用Spring注解管理事务,持久层使用mybatis. 连接mysql数据库完成项目的过程中发现不支持事务,因为 ...
- MockMvc 进行 controller层单元测试 事务自动回滚 完整实例
package com.ieou.ms_backend.controller; import com.google.gson.Gson; import com.ieou.ms_backend.dto. ...
- @Transactional注解事务不起作用
@Transactional注解事务不起作用 问题:今天在项目中碰到一个事务问题,使用@Transactional注解事务,抛出异常不会滚. 解决一:https://blog.csdn.net/u01 ...
- @Transactional注解事务
打了这个注解的类或者方法表示该类里面的所有方法或者这个方法的事务由spring处理,来保证事务的原子性,即方法里面对数据库操作,如果失败则spring负责回滚操作,成功提交操作 一.特性 1.serv ...
- spring + mybatis 注解式事务不回滚的原因分析 @Transactional
在一个项目中发现spring的事务无法回滚. DEBUG: org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.ses ...
随机推荐
- oracle 中怎样实现分页和去处重复
oracle 中用关键字 rownum 来进行分页 rownum 不能使用大于号,只能是使用小于号,可以使用子查询和rownum一起使用来创建分页 SELECT * FROM ( SELECT e. ...
- HailStone序列
目前HailStone序列还未被证明是否有穷,所以它未必是一个算法. * HailStone序列* n=1时,返回1:* n>1时且为偶数时,{n} ∪ {n/2}* n>1时且为奇数时, ...
- EBS 修改系统颜色
1)修改 配置文件: Java 色彩设计,选择相应的颜色 2)清理高速缓存 注:如果不清理缓存,则要等15分钟后才显示变成新设定的颜色
- java中线程状态
刚开始接触java时,就觉得多线程是一个障碍,不容易理解,当时选择了跳过,不过工作一段时间后,发现这块还是需要深入研究一下的,及时平时工作中不使用多线程,但一定会使用web容器,比如tomcat,也是 ...
- html5-meta标签和搜索引擎
emta标签的组成: meta标签分两大部分:HTTP-EQUIV 和 NAME 变量. HTTP-EQUIV:HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助 ...
- pytorch的matmul怎么广播
1)如果是两个1维的,就向量内积:2)如果两个都是2维的,就矩阵相乘3)如果第一个是1维,第二个是2维:填充第一个使得能够和第二个参数相乘:如果第一个是2维,第二个是1维,就是矩阵和向量相乘:例: a ...
- Hibernate3核心API-SchemaExport类
- Cinder AZ 与 Nova AZ 的同步问题
问题 今天处理了一个 Boot from volume 失败的问题,错误日志给出了明确的原因:The instance and volume are not in the same AZ. Build ...
- 八十九:redis之python操作redis
安装:pip install redis 连接 字符串操作 插入值 获取 删除值 列表操作,更多操作见源码 添加 获取 集合操作,更多操作见源码 哈希操作,更多操作见源码 事务操作:cache.pip ...
- ESP32开发之Windows开发环境
电脑出了问题linux系统下的环境不知道怎么就挂了,在一次搭建,总是出错,没办法,只能在win10下一试. 1 下载交叉编译工具,最新版 找到并下载最新的工具链: https://dl.espress ...