侧边栏壁纸
  • 累计撰写 27 篇文章
  • 累计创建 9 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

开发分享@Transactiona的使用

仓鼠
2024-03-28 / 0 评论 / 0 点赞 / 32 阅读 / 2639 字 / 正在检测是否收录...

开发分享

在日常开发过程一些小习惯,解决我们的生产问题。

1. 微服务事物

我们熟知的事物可能就是一个注解 @Transactional

从逻辑层面,他是判断了当前接口是否出现异常后进行事物的回滚,从而实现数据的一致性。

而真正的核心其实 是Mysql事物的开启、提交、回滚

这次遇到了一个bug

代码示例

	@Transactional
    public R<Test> update(MerchantProjectUserUpdateReq user){
        //基础业务.....

        //修改微服务数据
        //修改sys_user表
        R<Long> editPms = userService.editPmsUserUserType(null, null, SecurityConstants.INNER);
        if (editPms == null || editPms.getData() == null) {
            log.error("sysUser删除失败,微服务异常!");
            throw new ServiceException(SystemRespCode.SYSUSER_UPDATE_ERR);
        }

        //微服务调用
        //修改用户角色权限
        R<Boolean> roleUpdate = remotePmsUserRoleService.commitProject(user.getProjectId(), user.getId(), user.getUserId(), JSON.toJSONString(req.getProjectRoleIds()));

        //修改业务表信息
        merchantProjectUserMapper.updateById(user);


        //修改缓存
        redisService.setCacheObject(key,val);
    }

问题点:修改用户角色时没有对返回内容做判断。所以修改了登录人信息,但是没有修改成功用户角色。所以我们需要在微服务调用层面。进行如下修改

//微服务调用
//修改用户角色权限
R<Boolean> roleUpdate = remotePmsUserRoleService.commitProject(user.getProjectId(), user.getId(), user.getUserId(), JSON.toJSONString(req.getProjectRoleIds()));
if (roleUpdate == null || !roleUpdate.getData()) {
    log.error("用户权限修改失败!");
    throw new ServiceException(SystemRespCode.SYSUSER_UPDATE_ERR);
}

在未修改成功时,通过 throw new ServiceException(SystemRespCode.SYSUSER_UPDATE_ERR); 抛出异常。从而保证事物的一致性。

同时,为了更好的用户体验,我们应该添加好对应日志,并且返回时更加有好的进行提示。

@PostMapping("/api/upload")
public Result<String> uploadn(@Validated MerchantProjectUserUpdateReq req) {
    try {
        openLayoutService.uploadOpenLayout(req);
        return Result.ok("成功");
    } catch (ServiceException e) {
		//通过捕获我们可以掌握的异常。给出更加有好的提示
        return R.error(e.message);
    } catch (Exception e) {
        e.printStackTrace();
        log.error("系统异常:{}", e.getMessage());
        return R.error("系统异常");
    }
}

0

评论区