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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM