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

本文介绍了一种基于数据库唯一约束的订单优惠券派发机制,解决了高并发场景下同一订单重复派发优惠券的问题。通过调整流程,在派发前先插入记录,利用数据库的唯一性约束防止重复。

情况是这样的


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


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


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


我第一次的做法是这样的


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


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


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


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


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


具体的做法如下


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


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





 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值