「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」。
背景
没错,我还在做 XXXX 项目,还在与第三方对接接口,不同的是这次是对自己业务逻辑的处理。
在开发过程中我遇到这么一个问题:
表结构: 一张主表A ,一张关联表B ,表 A 中存储着表 B 记录的状态。
场景: 第一步创建主表数据,插入A表;第二步调用第三方接口插入B表同时更新A表的状态。此时大家应该都会想到在进行第二步的时候需要做好数据的幂等性。这样的话就会存在以下几种情况:
一、B表中不存在与A表关联的数据,此时需要调用第三方接口,插入B表同时更新A表的状态;
二、B表中存在与A表关联的数据;
- A表中的状态为处理中:直接返回处理中字样;
- A表中的状态为处理成功:直接返回成功的字样;
- A表中的状态为处理失败:此时需要调用第三方接口,更新B表同时更新A表的状态;
代码实现
首先我是这样编写的伪代码
B b = this.baseMapper.selectOne(queryWrapper);
if (b != null) {
String status = b.getStatus();
if (Objects.equals(Constants.STATUS_ING, status)){
return "处理中";
} else if (Objects.equals(Constants.STATUS_SUCCESS, status)){
return "处理成功";
}
//失败的操作
//请求第三方接口并解析响应结果
......
if (ReturnInfoEnum.SUCCESS.getCode().equals(parse.getCode())) {
......
//更新B表操作
bb.setStatus(Constants.STATUS_ING);
mapper.updateById(bb);
//更新A表的状态
a.setStatus(Constants.STATUS_ING);
aMapper.updateById(a);
}
} else {
//请求第三方接口并解析响应结果
......
if (ReturnInfoEnum.SUCCESS.getCode().equals(parse.getCode())) {
......
//插入B表操作
bb.setStatus(Constants.STATUS_ING);
mapper.insert(bb);
//更新A表的状态
a.setStatus(Constants.STATUS_ING);
aMapper.updateById(a);
}
}
不知道细心的小伙伴是否发现,存在B表记录并且状态为“失败”的情况和不存在B表的情况除了插入B表或者更新B表的操作之外,其余的操作都是相同的。
如果是你,你会将该代码做怎样的重构呢?思考一下,我们在下文中给出解决方案。如果你有不同的意见或者更好的idea
,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!