MYSQL添加购物车时如何防止重复添加及常见问题

【问题】

             同一个商品在购物车中出现了两个。

             即快速点击添加某款商品的时候,同一商品在购物车出现两次。

原因

         (1)添加购物车时, 首先第一步判断要加入购物车的商品是不是已经在购物车当中了,第二步,如果在的话走修改的接口方法,如果不在走添加接口(此操作一般在前端执行)。

         (2)因为两步不是原子的操作,所以短时间内快速点击添加购物车(点击前购物车该商品数量为0)就出现了多线程的安全问题。

【解决方案】

           MySQL insert有一个ON DUPLICATE KEY UPDATE的语法操作

 INSERT INTO  shopping_cart ( user_id, shop_id, good_id, quantity ) VALUES (66, 38, byt001, 1) ON DUPLICATE KEY UPDATE quantity = quantity + 1

           因为购物车ID一般设计时会设成主键自增,或者UUID()函数附值;故新创建一个唯一索引 index(user_id, shop_id, good_id)当唯一索引约束起作用时,会执行update语句,数量+1。

注意:】现在很多公司因为需要大数据统计,数据表设计成逻辑删除,即isdeleted字段状态判断是否为删除状态。

        这样的话数据表的唯一索引还要加上这个字段(不然删除的数据和正常数据混乱),删除相当于添加is_deleted0的值到数据表导致组合索引重复,故is_deleted无论是0.还是1,清空购物车都会因为唯一索引key重复报错

        对于这种表,一般由前端设置添加时缓冲时间,或者利用Redis的Lua脚本对接口的调用频率进行配置,再或者用最笨的方法,在添加购物车前进行一次查询购物车方法的调用对字段值进行判断。

常见现象

为了效率用到on duplicate key update进行自动判断是更新还是新增,一段时间后发现该表的主键id(已设置为连续自增),不是连续的自增,总是跳跃的增加,这样就造成id自增过快,已经快超过最大值了,通过查找资料发现,on duplicate key update有一个特性就是,每次是更新的情况下id也是会自增加1的,比如说现在id最大值的5,然后进行了一次更新操作,再进行一次插入操作时,id的值就变成了7而不是6.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值