订单重复提交问题
解决订单重复提交问题
问题背景
工作开发的项目中对于订单的处理还不够完善,在网络卡顿,恶意提交或者移动端提交后返回等,都会导致订单重复创建,导致数据出错。
问题分析
导致重复生成订单的原因是业务人员在生成订单后返回至前一个页面,继续点击生成订单按钮.解决方式很多,只要有唯一的标识,让系统知道这个订单已经存在,不能继续生成。
解决方案
使用UUID随机生成一个不重复的字符串,并存放至Redis中,在生成订单时,存放至Redis,并且每次生成订单去判断Redis中是否存在这个Key,如果存在则直接返回,并提示订单已经生成,不存在则生成token存入Redis。(此方案后续还需要根据业务并发修改)
public String cacheOrderSubmitToken(String userId) {
final String token = UUID.randomUUID().toString(); //使用UUID随机生成一串字符
stringRedisTemplate.opsForValue().set(getOrderSubmitTokenKey(userId),
token, Duration.ofMinutes(5L)); //过期时间暂设置
return token;
}private String takeOrderSubmitToken(String userId) {
final String key = getOrderSubmitTokenKey(userId);
return stringRedisTemplate.opsForValue().getAndDelete(key);
}常见的实现方案
- 唯一订单号生成:每次生成唯一的订单号,确保订单号在系统中是唯一的,可以基于数据库的自增主键、UUID等方式实现。
- 数据库约束:在数据库中通过唯一约束(Unique Constraint)或者索引来确保订单号的唯一性,防止重复插入相同订单号的订单。
- Token机制:通过生成一个单次有效的token,将token与订单绑定,再次提交时校验token的有效性,避免重复提交。
- 状态标记:在处理订单时,记录订单状态,避免已处理的订单再次被处理。
订单重复提交问题
http://example.com/2024/08/07/订单重复提交问题/