如果一组交易中的一个交易失败,是否可能使所有交易失败?
问题是我有一个可以“订购”的物品清单,其中一些可能缺货。
我首先递减每个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);
}
答案 0 :(得分:1)
Firebase实时数据库中的每个事务都是它自己的单独调用。没有一组交易的概念。
一次性修改所有库存水平的唯一方法是在一次交易中这样做。遗憾的是,这意味着事务必须在整个/item
节点上运行,这使得系统的可扩展性显着降低。
但可扩展性取决于争用的数量,如果在Node.js进程中运行此代码(控制并发性),则可以更容易控制。