离线时的 Firebase 实时数据库事务
Firebase real time database transaction while offline
我在 React Native 应用程序中使用 react-native-firebase 包,并试图了解事务如何在离线状态下工作。我正在尝试使用以下代码编写交易
firebase.database().ref('locations').transaction(locations => {
... my location modification logic,
return locations
})
但是,如果我在写入事务之前离线并且之前没有访问过引用因此没有缓存数据,locations
为空。
Firebase 的官方文档中有这个小花絮
Note: Because your update function is called multiple times, it must
be able to handle null data. Even if there is existing data in your
remote database, it may not be locally cached when the transaction
function is run, resulting in null for the initial value.
这让我相信我应该将整个交易逻辑包装在里面
if (locations) {
... my location modification logic
}
但是我还没有完全理解这一点。以下假设是否正确?
- 提交交易
- 如果存在离线和缓存数据,则对缓存数据应用事务,然后在连接恢复时对远程中的当前数据应用事务
- 如果离线且不存在缓存数据,则不应用事务。连接恢复后,将事务应用于远程
中的当前数据
- 如果在线,立即申请交易
如果这些假设是正确的,那么在案例 #3 中用户将不会立即看到他们的更改,但在案例 #2 中它将 'optimistically' 更新他们的缓存数据并且用户会立即感受到他们的行动发生。这是线下交易的运作方式吗?我错过了什么?
Firebase 实时数据库(和 Firestore)根本不支持离线交易。这是因为事务必须至少与服务器往返一次,以便安全地提交对数据的更改,同时避免与可能尝试更改相同数据的其他客户端发生冲突。
如果您想知道为什么 SDK 不只是保留处理事务的回调,那么可以说的是保留一个对象的实例(及其所有依赖状态,例如值范围内的所有变量)实际上非常困难,甚至在所有环境中都不可能。因此,您可以预期该事务仅在客户端应用程序在线且能够与服务器通信时才有效。
我在 React Native 应用程序中使用 react-native-firebase 包,并试图了解事务如何在离线状态下工作。我正在尝试使用以下代码编写交易
firebase.database().ref('locations').transaction(locations => {
... my location modification logic,
return locations
})
但是,如果我在写入事务之前离线并且之前没有访问过引用因此没有缓存数据,locations
为空。
Firebase 的官方文档中有这个小花絮
Note: Because your update function is called multiple times, it must be able to handle null data. Even if there is existing data in your remote database, it may not be locally cached when the transaction function is run, resulting in null for the initial value.
这让我相信我应该将整个交易逻辑包装在里面
if (locations) {
... my location modification logic
}
但是我还没有完全理解这一点。以下假设是否正确?
- 提交交易
- 如果存在离线和缓存数据,则对缓存数据应用事务,然后在连接恢复时对远程中的当前数据应用事务
- 如果离线且不存在缓存数据,则不应用事务。连接恢复后,将事务应用于远程 中的当前数据
- 如果在线,立即申请交易
如果这些假设是正确的,那么在案例 #3 中用户将不会立即看到他们的更改,但在案例 #2 中它将 'optimistically' 更新他们的缓存数据并且用户会立即感受到他们的行动发生。这是线下交易的运作方式吗?我错过了什么?
Firebase 实时数据库(和 Firestore)根本不支持离线交易。这是因为事务必须至少与服务器往返一次,以便安全地提交对数据的更改,同时避免与可能尝试更改相同数据的其他客户端发生冲突。
如果您想知道为什么 SDK 不只是保留处理事务的回调,那么可以说的是保留一个对象的实例(及其所有依赖状态,例如值范围内的所有变量)实际上非常困难,甚至在所有环境中都不可能。因此,您可以预期该事务仅在客户端应用程序在线且能够与服务器通信时才有效。