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

  • 相关阅读:
    Python:dict用法
    Ubuntu无法识别显示器情况下,高分辨率的设置
    select节点clone全解析
    js控制frameset的rows
    jQuery中事情的动态绑定 (转)
    jQuery动态添加表格1
    使用ajax,后台传回的数据处理
    Spring Boot 之构建Hello Word项目
    linux防火墙基本操作
    Vmware虚拟机中安装cnetOS7详细图解步骤
  • 原文地址:https://www.cnblogs.com/matd/p/10879705.html
Copyright © 2020-2023  润新知