【问题标题】:AsyncStorage - Is multiSet() transactional?AsyncStorage - multiSet() 是事务性的吗?
【发布时间】:2016-04-18 10:53:33
【问题描述】:

我有一个应用程序,我计划从服务器中提取一些数据,然后使用 AsyncStorage 存储这些数据。所以不需要不断地获取我的数据。 我使用fetch() 获取几个json,然后使用AsyncStore.multiSet() 存储它们。

但是,如果在 AsyncStorage 中存储我的大约 5 个 json 对象时出现问题,我不希望存储其中任何一个。使数据保持正确的状态。因此,我想使用交易存储它们。

如果在存储我的对象的过程中出现问题并且存储失败会发生什么。例如,如果应用程序被用户关闭或者他们的电池电量耗尽。

在这种情况下会发生什么?我的前 2 个对象可以保存,而其他 3 个不保存吗?

【问题讨论】:

    标签: react-native asyncstorage


    【解决方案1】:

    它似乎因底层存储实现而异。

    查看the implementation of AsyncStorage.js,React Native 依次查找并使用 RocksDB、SQLite 和 AsyncLocalStorage,然后使用它可以找到的第一个。

    我似乎在 React Native 代码库中找不到任何 RocksDB 实现。但是,查看文档,似乎在使用“TransactionDB 或 OptimisticTransactionDB”时支持事务:

    https://github.com/facebook/rocksdb/wiki/Transactions
    

    如果 SQLite 是底层实现:

    https://github.com/facebook/react-native/blob/235b16d93287061a09c4624e612b5dc4f960ce47/ReactAndroid/src/main/java/com/facebook/react/modules/storage/AsyncStorageModule.java#L147
    

    它看起来好像试图保存所有可能的东西:

      /** 
       * Inserts multiple (key, value) pairs. If one or more of the pairs cannot be inserted, this will
       * return AsyncLocalStorageFailure, but all other pairs will have been inserted.
       * The insertion will replace conflicting (key, value) pairs.
        */
      @ReactMethod
      public void multiSet(final ReadableArray keyValueArray, final Callback callback) {
    

    最后,从the React Native implementation of AsyncLocalStorage来看,底层实现的最终可能性,似乎它也尽可能地保存了一切,将失败案例的错误在发生时存储起来:

      for (NSArray<NSString *> *entry in kvPairs) {
        NSDictionary *keyError = [self _writeEntry:entry changedManifest:&changedManifest];
        RCTAppendError(keyError, &errors);
      }
    

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 2012-09-28
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 2013-01-03
      • 1970-01-01
      相关资源
      最近更新 更多