常见于抢购、人数限制等场景。

1. 利用原子操作符

借助原子操作符,可以实现。原子操作符包括:

  • inc
  • mul
  • addToSet

例:

const _ = db.command;

let res = await db.collection('my_collection').where({
    _id: id,
    limit: _.lt(10)
}).update({
    data: {
        limit: _.inc(1)
    }
})

通过使用原子操作符inc,避免并发写的影响。

小程序云开发文档是这样描述的:

用 inc 指令而不是取出值、加 10 再写进去的好处在于这个写操作是个原子操作,不会受到并发写的影响,比如同时有两名用户 A 和 B 取了同一个字段值,然后分别加上 10 和 20 再写进数据库,那么这个字段最终结果会是加了 20 而不是 30。如果使用 inc 指令则不会有这个问题。
(https://developers.weixin.qq....)

2. 利用事务

如果需要一次操作多个Collection,或者一次要操作多条记录时,可以使用事务完成。
云开发提供了两种接口:

  • runTransaction
  • startTransaction

具体使用方法及区别,请参考小程序云开发文档。

需要注意的是:

1. runTransaction通过回调返回一个transaction对象,startTransaction直接返回一个transaction对象,所有事务操作都要在transaction对象之下进行。
2. transaction对象提供一个collection方法,操作类似于db.collection,但是仅支持单记录操作(collection.doc, collection.add),不支持批量操作(whereaggregate)。

wei4118268
88 声望1 粉丝

前端从业者