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

参考文章  SpringBoot笔记5 事务特别篇——当@Transactional不起作用如何排查问题 - HappyBKs的Research Center - OSCHINA - 中文开源技术交流社区   @Transactional注解事务不回滚不起作用无效_事务注解一直没断开_一年e度的夏天的博客-CSDN博客

基本涵盖了事务所有得解决方法 

我得情况是 在一个service中的一个没有事务管理得方法,调用了一个有事务管理得方法,在这种情况下 spring容器是不知道,所以事务是不起作用的 。

类似这种  随手写的一个类似例子:
 

 

解决办法:

1、创建一个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 getBean(String beanName, Class clazz) {
        return context.getBean(beanName, clazz);
    }
    /**
     * 根据类型获取bean
     * @param clazz
     * @return
     */
    public static  T getBean(Class clazz) {
        T t = null;
        Map map = context.getBeansOfType(clazz);
        for (Map.Entry 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)? "保存成功":"保存失败"; 

即可解决。

2、

这样调用方法,前提需要开启 @EnableAspectJAutoProxy(exposeProxy = true)
((UserService) AopContext.currentProxy()).create();

3、自己注入自己来解决
@Autowired
UserService userService;

userService.create();

如果有错 , 请指正。 谢谢!

你可能感兴趣的:(java)