【问题标题】:Firestore - Some doubts about Transactions and lockingFirestore - 关于事务和锁定的一些疑问
【发布时间】:2022-01-24 02:10:24
【问题描述】:

我正在使用优惠券系统上的云功能,当用户验证他的邮件地址时,该优惠券会分配给用户。

对于我的设计,我有一个 /coupons 集合,其中预装了很多优惠券。

用户验证他的邮件地址调用 HTTP firebase 函数,为此我想将优惠券分配给用户从优惠券集合中选择一个,通过优惠券集合上名为“userId”的字段查询。

查询示例:

const pickOne = () => {
    return firestore
        .collection('coupons')
        .where('userId', "==", 'none')
        .limit(1)
}

我知道 Firestore 交易。

我的想法(如果可能的话)是调用 pickOne 作为事务 get() 函数的参数,并在其上写入值“userId”,然后关闭并提交事务。

我的疑问与锁定系统有关:是否可以避免并发用户可能拥有相同的优惠券?

【问题讨论】:

    标签: node.js firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    是的,您可以在事务中执行此类查询,以有效地为用户找到单个文档,在其中写入他们的 ID,并防止它在具有相同查询的其他事务中再次使用。它仅适用于后端 SDK(如 nodejs),不适用于客户端 SDK。我在其他项目中也做过这种事情。

    详情请参阅API documentation

    您唯一应该注意的是,在高写入压力下,事务可能会由于retried 次数过多而失败。在这种情况下,您将不得不在代码中显示错误或手动重试。

    【讨论】:

    • 您好,感谢您的快速回答。由于这是邮件验证后分配的优惠券,因此我认为获得大量并发写入的可能性很小。我的担忧是由于多个用户使用相同的优惠券。我试试,谢谢!
    • 只要在您获得的文档上没有发生事务之外的其他写入,就应该没问题。
    • 好的,道格,太好了!!最后一个问题:由于在事务中调用了pickOne函数,并且在触发器中打开了此事务,因此如果同时执行此触发器(.auth.user.onCreate),我确定如果查询的文档将被更新,则事务会重试, 这样对吗?例如:如果我有两张优惠券(COU001 和 COU002 有两个文件)和两个同时注册的用户,同一个交易应该返回 COU001 给两个用户,但只有一个触发更新,然后交易重试并获取COU002。对吗?
    • 如果只是在事务中调用此函数将不起作用。您需要使用提供给事务回调的对象来进行查询。请参阅我链接的 API 文档并查看交易文档。 firebase.google.com/docs/firestore/manage-data/…
    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2012-12-01
    • 2018-08-04
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多