我正在一个耦合系统上使用云函数,当用户验证他的邮件地址时,该系统会将优惠券分配给他。
对于我的设计,我有一个/优惠券系列,预装了很多优惠券。
用户通过调用HTTP firebase函数验证他的邮件地址,我想将优惠券分配给通过名为"的字段查询的从优惠券集合中挑选一个的用户;userId";优惠券收集。
查询示例:
const pickOne = () => {
return firestore
.collection('coupons')
.where('userId', "==", 'none')
.limit(1)
}
我知道Firestore交易。
我的想法(如果可能的话(是调用pickOne作为transaction get((函数的参数,并写入值";userId";上,然后关闭并提交事务。
我的疑问和锁定系统有关:是否可以避免并发用户拥有相同的优惠券?
是的,您可以在事务中执行这种类型的查询,以有效地为用户找到单个文档,并在其中写入用户的ID,并防止其在具有相同查询的其他事务中再次使用。它只适用于后端SDK(如nodejs(,而不适用于客户端SDK。我在其他项目中也做过类似的事情。
有关详细信息,请参阅API文档。
您唯一应该注意的是,在高写压力下,事务可能会由于重试次数过多而失败。在这种情况下,您必须在代码中显示错误或手动重试。