ppgjx 发表于 2023-12-12 10:18

关于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 这个事务级别可能导致幻读,如果这个接口并发量很大就会导致数据错乱,但是支付接口肯定是要求数据强一致性的,我知道的是两种
方案,一是数据库默认级别改成串行化,二是方法加锁,但是这两种方法会极大地拖慢速度,一个请求没处理完,另一个请求是没办法进来处理的,请问正常工作中这种问题怎么处理的?

小火炖蘑菇 发表于 2023-12-12 10:30

你的这个业务肯定有一个唯一id,可以对这个唯一id进行校验

古道边 发表于 2023-12-12 10:46

1、乐观锁
2、分布式锁
3、消息队列

FruitBaby 发表于 2023-12-12 10:48

多虑了,innodb引擎做了处理了,

waibolisi 发表于 2023-12-12 11:48


多虑了,innodb引擎做了处理了,

流泪的小白 发表于 2023-12-12 14:37

支付接口大部分都是异步的,并且有订单号全局唯一,不需要考虑那么多东西的

nwl909690050 发表于 2023-12-12 15:41

本帖最后由 nwl909690050 于 2023-12-12 15:44 编辑

参考别人的就行了,别想太多

程序_伪 发表于 2023-12-20 11:52

不锁业务,锁数据
页: [1]
查看完整版本: 关于spring boot事务的@Transactional的并发问题