springboot2.X版本得@Transactional注解事务不回滚不起作用

时间:2022-12-30 22:54:26

参考文章  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
版权声明:本文为博主原创文章,转载请附上博文链接!