开发分享
在日常开发过程一些小习惯,解决我们的生产问题。
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("系统异常");
}
}
评论区