领取优惠券业务逻辑
count = getReceivedCount(userId,couponId);
if(count>=1) //假如每人限领一张
//提示已领取 直接返回
insertUserReceiveLog(userReceiveLog);
这种情况没法处理这些情况:
网络卡导致重复提交的情况
恶意调用接口
于是很有可能会插入多条记录 即同一用户领取了多张券
如何避免这种情况发生呢?
同步领取方法吗? 如
synchronized void receiveCoupon(...)
使用redis保存进入方法时间戳(如
set userId_1_receive_coupon_1 1460717130000
)
比较两个最近两次调用的时间戳 如果小于1秒 表示重复提交还是直接在
nginx
层或其他的地方如filter
统一处理重复提交的情况 如果判断为重复 直接返回
数据表加个字段表示状态,插入数据前先检查该状态值,符合要求才写入数据。
把这个事放客户端就容易多了,提交之后就把页面状态锁定,加个loading浮层,禁止用户继续操作。并且把客户端的请求超时时间设置的长点,基本上就能解决你的问题了。服务端也能减少各种验证什么的。