利用数据库唯一约束解决线程安全的一个问题

来源:互联网 发布:tp link软件升级 编辑:程序博客网 时间:2024/04/29 18:38

情况是这样的


用户在我们商城上买商品并付完款后会有一个 orderId 号,拿着这个号和用户的token(当然是我们程序员处理的) 去请求一个连接可以得到优惠券


我在后台还需要保存派送记录表,由于orderid 是唯一的,而且每个orderId 只能获得一张优惠券,由于前端可能被多次调用(前端有bug),那就会导致多次用


同一个orderId 进行派送优惠券,所以需要解决这个问题


我第一次的做法是这样的


每次去获得优惠券的时候先到数据库的  派送记录表查询 这个 orderId 是否已经进行过派送,如果已经派送那就返回提示给用户已经领取过优惠券了


刚开始没考虑那么多,以为这样就行了,后来看了一下日志,发现了问题,生产环境上有6台机,每次都是先查询数据库,如果用户以某一个orderid


进行了大量的并发,那么很有可能在还没插入数据时不断的调用了派卷接口,因为派卷接口是第三方的,耗时比较长,在还没插入数据的时候又有请求


进来就导致了会发送多个派卷请求去派卷,出现了线程安全的问题,,,遇到这个问题后我第一反应就是利用  synchronized  关键字来处理这个问题,


但是这样会导致并发降低,效率低下,故没有采取,经过了一定时间的考虑,我想到了用数据库的 唯一约束可以解决这个问题


具体的做法如下


首先为 派送记录表的 orderId 字段 添加一个唯一约束条件,然后程序里面改为一进来就插入数据,插完数据再进行派卷,这样一来出现 违反约束条件异常


的时候就直接提示用户已经领取过优惠券, 派送优惠券的代码也就不用执行,这样就避免了同一个 orderId 进行多次派送优惠券





 

阅读全文
0 0
原创粉丝点击