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