情况是这样的
用户在我们商城上买商品并付完款后会有一个 orderId 号,拿着这个号和用户的token(当然是我们程序员处理的) 去请求一个连接可以得到优惠券
我在后台还需要保存派送记录表,由于orderid 是唯一的,而且每个orderId 只能获得一张优惠券,由于前端可能被多次调用(前端有bug),那就会导致多次用
同一个orderId 进行派送优惠券,所以需要解决这个问题
我第一次的做法是这样的
每次去获得优惠券的时候先到数据库的 派送记录表查询 这个 orderId 是否已经进行过派送,如果已经派送那就返回提示给用户已经领取过优惠券了
刚开始没考虑那么多,以为这样就行了,后来看了一下日志,发现了问题,生产环境上有6台机,每次都是先查询数据库,如果用户以某一个orderid
进行了大量的并发,那么很有可能在还没插入数据时不断的调用了派卷接口,因为派卷接口是第三方的,耗时比较长,在还没插入数据的时候又有请求
进来就导致了会发送多个派卷请求去派卷,出现了线程安全的问题,,,遇到这个问题后我第一反应就是利用 synchronized 关键字来处理这个问题,
但是这样会导致并发降低,效率低下,故没有采取,经过了一定时间的考虑,我想到了用数据库的 唯一约束可以解决这个问题
具体的做法如下
首先为 派送记录表的 orderId 字段 添加一个唯一约束条件,然后程序里面改为一进来就插入数据,插完数据再进行派卷,这样一来出现 违反约束条件异常
的时候就直接提示用户已经领取过优惠券, 派送优惠券的代码也就不用执行,这样就避免了同一个 orderId 进行多次派送优惠券