@PostMapping("/update") //乐观锁
public R<String> TestUpdate(@RequestBody Test test){
int attempt = 0;
int maxAttempts = 5; // 最大重试次数,根据需要调整
long threadId = Thread.currentThread().getId(); // 获取当前线程的ID
while(attempt < maxAttempts){
test = testService.getById(test.getId());
if(test.getNum() > 0){
test.setNum(test.getNum() - 1);
if(testService.updateById(test)){
// 在日志中包含线程ID和版本号
log.info("线程ID: {}, 成功更改1条, 当前版本号: {}", threadId, test.getVersion());
return R.success("成功更改1条");
}else{
// 更新失败,增加重试次数
attempt++;
// 在日志中包含线程ID和版本号
log.info("线程ID: {}, 尝试重试更新..., 当前版本号: {}", threadId, test.getVersion());
continue; // 继续下一次循环尝试更新
}
} else {
// 在日志中包含线程ID和版本号
log.info("线程ID: {}, 库存不足, 当前版本号: {}", threadId, test.getVersion());
return R.error("库存不足");
}
}
// 在日志中包含线程ID和版本号
log.info("线程ID: {}, 更新失败,达到最大重试次数, 当前版本号: {}", threadId, test.getVersion());
return R.error("更新失败,请稍后再试");
}
用apipost并发压测
结果:
这个示例通过简单的循环和计数器实现了重试机制。在实际应用中,重试逻辑可以根据具体需求进行更复杂的设计,例如添加随机或固定的延迟等。