离线时Firebase实时数据库事务

时间:2018-07-20 20:03:43

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

我正在React Native应用程序中使用react-native-firebase软件包,并试图了解事务如何在脱机状态下工作。我正在尝试使用以下代码编写交易

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

    return locations
})

但是,如果我在写事务之前脱机并且以前没有访问过引用,因此没有缓存的数据,则locations为空。

Firebase的官方文档中有一个小窍门

  

注意:因为您的更新函数被多次调用,所以它必须   能够处理空数据。即使您已有数据   远程数据库,在事务处理时可能未在本地缓存   函数运行,结果为空。

哪个使我相信我应该将整个事务逻辑包装在内部

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

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

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

如果这些假设是正确的,则在情况3中用户将不会立即看到他们的更改,但是在情况2中,用户将“乐观地”更新其缓存的数据,并且用户会感觉到他们的操作立即发生。这是离线交易的工作方式吗?我想念什么?

1 个答案:

答案 0 :(得分:1)

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

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