关于spring boot事务的@Transactional的并发问题
@ApiOperation(value = "支付验证")@RequestMapping(value = "/verify",method = RequestMethod.POST)
@Transactional
public Result verify(@RequestBody @Validated IosPayVerifyReq req,@RequestHeader String uid, HttpServletRequest request, HttpServletResponse response){
iosPayService.verify(req,uid);
return Result.success();
}
比如这个代码加了@Transactional 默认异常回滚是没问题的 但是数据库是mysql 会采用默认数据库的默认级别 EPEATABLE READ 这个事务级别可能导致幻读,如果这个接口并发量很大就会导致数据错乱,但是支付接口肯定是要求数据强一致性的,我知道的是两种
方案,一是数据库默认级别改成串行化,二是方法加锁,但是这两种方法会极大地拖慢速度,一个请求没处理完,另一个请求是没办法进来处理的,请问正常工作中这种问题怎么处理的? 你的这个业务肯定有一个唯一id,可以对这个唯一id进行校验 1、乐观锁
2、分布式锁
3、消息队列 多虑了,innodb引擎做了处理了,
多虑了,innodb引擎做了处理了, 支付接口大部分都是异步的,并且有订单号全局唯一,不需要考虑那么多东西的 本帖最后由 nwl909690050 于 2023-12-12 15:44 编辑
参考别人的就行了,别想太多 不锁业务,锁数据
页:
[1]