【问题标题】:Firebase transaction on where query关于 where 查询的 Firebase 事务
【发布时间】:2022-01-18 16:54:47
【问题描述】:

我正在开发一款带有游戏内匹配功能的游戏,用户可以在其中创建游戏并等待其他玩家加入。

在 Firebase 中,我创建了一个“游戏”集合,其中的文档结构如下所示:

匹配算法真的很简单:

  • 用户查询他可以加入的开放游戏(isStarted == true && player2 == null)
    • 如果返回一个文档,则用户加入游戏,通过用户数据更新 player2 属性并在参与者数组中添加用户 ID。
    • 如果没有返回任何文件,则创建一个游戏并等待其他玩家加入

实际上,游戏正在制作中,我观察到一个问题:当应用程序流量高时,一些游戏已经有 2 个用户加入(因此游戏中有 3 个用户而不是 2 个用户)。

理想情况下,我想通过查询进行交易,以确保文档没有更改(并且没有被其他用户加入)。如果由于其他用户已加入游戏而更改了文档,则获取另一个文档。 不幸的是,Firebase 文档提到事务不适用于查询。

有没有人想在不阅读太多文档的情况下解决这个问题?谢谢!

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    不幸的是,Firebase 文档提到事务不适用于 查询。

    这适用于客户端 SDK(包括 FlutterFire 插件),但不适用于 Admin SDKs。 Admin SDK 使用悲观并发控制,因此您可以对查询返回的文档进行事务处理。文档中的更多通用信息here

    因此您可以使用云函数来执行您的算法。最合适的可能是Callable Cloud Function。可以在 here 找到 Node.js Admin SDK 的事务文档(用于云函数)。特别是,您会看到可以将 Query 传递给 get() 方法。

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 2021-06-17
      • 2021-11-13
      • 2021-09-26
      • 2021-08-06
      相关资源
      最近更新 更多