收藏
回答

云开发能否处理秒杀或者电商中超卖的问题?

框架类型 问题类型 终端类型 AppID 基础库版本
小程序 需求 工具 暂无 2.2.3

- 需求的场景描述(希望解决的问题)

比如在秒杀的场景,怎么处理超卖的问题?

是否能给某次读写加锁,或者其他解决方案?


- 希望提供的能力

云函数读写加锁或者其他能够保证读写过程中没有其他写入操作。


回答关注问题邀请回答
收藏

3 个回答

  • iFeng
    iFeng
    2019-01-28

    你好,云开发数据库暂时并不提供显式的事务和锁,但是对于单条数据的操作仍然能保证原子性。

    对于你的需求,推荐临时这样处理:

    1. 数据库中建一个活动,并加一个 goodsLeft 字段(number 类型),表示剩余多少商品

    2. 通过这样的代码执行抢购:
      db.collection('activity').where({
          activity_id: _.eq("test1"),
          goodsLeft: _.gt(0)
        }).update({
          data: {
            goodsLeft: _.inc(-1) //每次把剩余商品数减一
          }
        }).then(function(d){
          if(d.stats.updated>0) { /*抢购成功*/ }
          else { /*抢购失败*/ }
        })
    2019-01-28
    有用 2
    回复 2
    • 2019-01-28

      谢谢!

      2019-01-28
      回复
    • 杜凡
      杜凡
      2020-04-21
      你好我想问一下你上面的写法中
      activity_id: _.eq('test1')  这样写可以吗  activity_id:'test1'  这样有区别吗?我都是后面这样写的。
      2020-04-21
      回复
  • 半寸灰
    半寸灰
    2019-01-28

    没有锁的

    数据可能重复

    2019-01-28
    有用
    回复
  • 悟空
    悟空
    2019-01-28

    云开发处理秒杀还是算了吧,以现有的云开发能力也就做做增删改查的事情

    2019-01-28
    有用
    回复 2
    • 2019-01-28

      没有秒杀那么高并发,但是也存在同时写的情况,那普通的电商呢,也不能实现控制库存的情况吗?

      2019-01-28
      回复
    • 塑料大棚
      塑料大棚
      2020-04-07
      对呀,我也遇到这个问题了,普通两个用户也可能买同一件库存只剩1个的产品啊
      2020-04-07
      回复
登录 后发表内容