## async-lock 参考文档:https://www.npmjs.com/package/async-lock ``` const AsyncLock = require('async-lock') const lock = new AsyncLock({ maxPending: 20, // 最大并发数 timeout: 3000 // 超时时间 }) ``` ### 接口逻辑 ``` await lock.acquire('bookingLockKey', async function () { // 判断数据集合是否超卖 ...... // 监听 注:redis不会事务回滚,除非sadd decr等语法问题,不然都会把正确的代码执行, await redis.watch(bookKey) const multiRes = await redis .multi() .sadd(key, JSON.stringify(params.car_mac)) // 创建数据集合 .decr(bookKey) .exec() if (!multiRes) throw '预约人数较多,请稍后重试' } ```