Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
脱机时Firebase实时数据库事务_Firebase_Firebase Realtime Database_React Native Firebase - Fatal编程技术网

脱机时Firebase实时数据库事务

脱机时Firebase实时数据库事务,firebase,firebase-realtime-database,react-native-firebase,Firebase,Firebase Realtime Database,React Native Firebase,我正在react本机应用程序中使用react本机firebase包,并试图了解事务如何在脱机状态下工作。我正在尝试使用以下代码编写一个事务 firebase.database().ref('locations').transaction(locations => { ... my location modification logic, return locations }) 但是,如果我在写入事务之前脱机,并且以前没有访问过引用,因此没有缓存数据,locations为

我正在react本机应用程序中使用react本机firebase包,并试图了解事务如何在脱机状态下工作。我正在尝试使用以下代码编写一个事务

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

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

Firebase的官方文档中有这样一个小道消息

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

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

if (locations) {
   ... my location modification logic
}
但我仍然不完全理解这一点。以下假设正确吗

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

  • 如果这些假设是正确的,那么用户将不会立即看到案例3中的更改,但在案例2中,它将“乐观地”更新他们的缓存数据,用户将感觉他们的操作立即发生。脱机事务就是这样工作的吗?我缺少什么?

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


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

    IIRC,如果您脱机,事务会立即失败,因为它们需要针对服务器验证数据才能成功。它不会“等待并重新申请”。我一点也不怀疑你的答案,但我仍然感到困惑。据我所知,Firebase的官方文档并未说明离线事务不受支持,而在“离线写入数据”一节下的“离线写入数据”一节中,似乎说明了相反的情况,即每个客户端都有一个数据的本地副本,先写入更改,然后再同步更改。除了事务之外,其他一切都遵循本地缓存的一般规则。如果您发现文档令人困惑,请通过右上角的“发送反馈”按钮自由表达您对文档的担忧。明白了,我一定会这么做。谢谢