【问题标题】:Firebase real time database transaction while offline离线时的 Firebase 实时数据库事务
【发布时间】:2018-12-29 04:24:50
【问题描述】:

我在 react-native-firebase 应用程序中使用 react-native-firebase 包,并试图了解事务如何离线工作。我正在尝试使用以下代码编写事务

firebase.database().ref('locations').transaction(locations => {
    ... my location modification logic,

    return locations
})

但是,如果我在编写事务之前离线并且之前没有访问过引用,因此没有缓存数据,locations 为空。

Firebase 的官方文档中有这个小花絮

注意:因为你的更新函数被多次调用,它必须 能够处理空数据。即使您的数据中存在现有数据 远程数据库,事务时可能没有本地缓存 函数运行,导致初始值为 null。

这让我相信我应该将整个事务逻辑包装在里面

if (locations) {
   ... my location modification logic
}

但我仍然没有完全理解这一点。以下假设是否正确?

  1. 提交交易
  2. 如果存在离线和缓存数据,则对缓存数据应用事务,然后在连接恢复时应用于远程当前数据
  3. 如果离线且不存在缓存数据,则不要应用事务。连接恢复后,将事务应用于远程中的当前数据
  4. 如果在线,立即申请交易

如果这些假设是正确的,那么用户将不会立即看到他们在案例 #3 中的更改,但在案例 #2 中它将“乐观地”更新他们的缓存数据,并且用户会觉得他们的操作立即发生了。这就是离线交易的运作方式吗?我错过了什么?

【问题讨论】:

  • IIRC,如果您处于离线状态,事务会立即失败,因为它们需要针对服务器验证数据才能成功。它不会“等待并重新申请”。

标签: firebase firebase-realtime-database react-native-firebase


【解决方案1】:

Firebase 实时数据库(和 Firestore)根本不支持离线事务。这是因为一个事务必须至少与服务器往返一次才能安全地提交对数据的更改,同时还避免与可能试图更改相同数据的其他客户端发生冲突。

如果您想知道为什么 SDK 不只是持久化处理事务的回调,那么可以说是持久化一个对象的实例(以及它的所有依赖状态,例如 all 的值)范围内的变量)实际上非常困难,甚至在所有环境中都不可能。因此,您可以期望该事务仅在客户端应用程序在线并且能够与服务器通信时才起作用。

【讨论】:

  • 我一点也不怀疑你的回答,但我仍然很困惑。据我所知,Firebase 的官方文档没有声明不支持离线事务,并且在事务部分下的“离线写入数据”部分中,似乎相反,说每个客户端都有一个本地副本更改的数据首先写入,然后同步。 firebase.google.com/docs/database/web/…
  • 除了事务之外的一切都遵循本地缓存的一般规则。如果您发现文档令人困惑,请随时使用右上角的“发送反馈”按钮对文档表达您的疑虑。
  • 知道了,我一定会这样做的。谢谢!
猜你喜欢
  • 2017-01-12
  • 2021-11-23
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2020-09-19
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多