如果Firebase中出现故障,则会失败所有交易

时间:2018-03-18 20:53:45

标签: node.js firebase firebase-realtime-database

如果一组交易中的一个交易失败,是否可能使所有交易失败?

问题是我有一个可以“订购”的物品清单,其中一些可能缺货。

我首先递减每个stockLevel,如果成功,则销售继续进行。

如果其中一个交易失败,那么我需要增加(即回滚/恢复)库存水平成功减少的库存水平。

示例:

function decrementStock(itemQuantities) {
  let db = admin.database();
  let ref = db.ref("/products");
  let promises = Object.keys(itemQuantities)
  .map(item => ref.child(`/${item}/stockLevel`)
    .transaction(function(currentStockLevel) 
      if (currentStockLevel === 0) {
        return; // Abort the transaction.
      }
      return currentStockLevel -= itemQuantities[item];
  }));  

  return Promise.all(promises);
}

1 个答案:

答案 0 :(得分:1)

Firebase实时数据库中的每个事务都是它自己的单独调用。没有一组交易的概念。

一次性修改所有库存水平的唯一方法是在一次交易中这样做。遗憾的是,这意味着事务必须在整个/item节点上运行,这使得系统的可扩展性显着降低。

但可扩展性取决于争用的数量,如果在Node.js进程中运行此代码(控制并发性),则可以更容易控制。