0
点赞
收藏
分享

微信扫一扫

springboot 事务失效问题记录

90哦吼 2022-01-07 阅读 82

问题描述:

用户实现类 UserServiceImpl方法添加注解
@Transactional(rollbackFor = {Exception.class, Error.class})
事务失效问题,代码如下:

class UserServiceImpl implements UserService
/**
 * 文件上传类型
 **/
private static String uploadType;
 @Override
 @Transactional(rollbackFor = {Exception.class, Error.class})
public void insert(User user,MultipartFile file){
	userMapper.insert(user);
	roleMapper.insert(role);
	checkFile(file);
	uploadFile(file)
}
private void checkFile(MultipartFile file) {
        //判断文件大小
        if (file!=null && && !file.isEmpty()) {
            throw new ParameterException("头像不能为空");
        }
}

/**
 * 判断配置文件中是否配置
 **/
@Autowired
private UserServiceImpl(@Value("${file.upload.type}") String uploadType) {
	if (StringUtils.isEmpty(uploadType)) {
      logger.error("配置文件中不存在头像上传方式,请联系管理员!");
   }
       UserServiceImpl.uploadType = uploadType;
}

当文件为空时,用户仍能插入到数据库当中,事务失效。

原因分析

参考相关文章发现,userServiceImpl为非代理类时,导致事务失效。那么什么原因导致userServiceImpl边为非代理类呢?是构造方法验证配置文件信息是否存在引起的。所以便有了以下解决方案。

优化方案

userServiceImpl 实现InitializingBean 接口 重写afterPropertiesSet()方法进行验证。 这样事务失效的问题就解决了

class UserServiceImpl implements UserService, InitializingBean

@Value("${file.upload.type}
private String uploadType;

@Override
@Transactional(rollbackFor = {Exception.class, Error.class})
public void insert(User user,MultipartFile file){
	userMapper.insert(user);
	roleMapper.insert(role);
	checkFile(file);
	uploadFile(file)
}
private void checkFile(MultipartFile file) {
        //判断文件大小
        if (file!=null && && !file.isEmpty()) {
            throw new ParameterException("头像不能为空");
        }
}

/**
 * 判断配置文件中是否配置
 **/
@Override
public void afterPropertiesSet() throws Exception {
	if (StringUtils.isEmpty(uploadType)) {
      logger.error("配置文件中不存在头像上传方式,请联系管理员!");
   }
}
举报

相关推荐

0 条评论