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

情况是这样的


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


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


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


我第一次的做法是这样的


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


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


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


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


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


具体的做法如下


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


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





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值