参考文章 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> 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)? "保存成功":"保存失败";
即可解决。
2、
这样调用方法,前提需要开启 @EnableAspectJAutoProxy(exposeProxy = true) ((UserService) AopContext.currentProxy()).create(); 3、自己注入自己来解决
@Autowired UserService userService; userService.create();
如果有错 , 请指正。 谢谢!