2013-04-20 87 views
2

我正在运行一个事务来更新需要存储在两个键中的项目。要做到这一点,我已经建立了嵌套事务如下,似乎如预期运行:Firebase中嵌套事务的影响?

firebaseOOO.child('relationships/main').child(accountID).child(friendAccountID).transaction(function(data) { 
    data.prop = 'newval'; 
    firebaseOOO.child('relationships/main').child(friendAccountID).child(accountID).transaction(function(data) { 
     return r; 
    }); 
    return r; 
}); 

是否有任何陷阱或可能的意外影响到这一点?我最担心的是在负载下陷入某种事务循环,其中每个事务都会取消另一个事务,迫使它们重新启动或类似。

有没有更好的方法来做到这一点?

我正在使用NodeJS客户端。

+0

为什么不尝试多位置更新? - https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html – Badie 2018-03-04 21:40:40

回答

4

您可能不想从回调中的第一个事务开始另一个事务。无法保证您的第一笔交易的运行次数有多少次,特别是当您尝试更新的地点存在大量争用时。

一个更好的解决方案,我相信你在另一个问题中遇到了,就是在检查完第一个提交后,从完成回调中启动第二个事务。

+0

不错的解决方案,但这会使数据库处于不一致的状态。如果有人在第一笔交易结束但第二笔交易尚未完成时正在读取数据呢? 是否有任何解决方案将事务添加到updateChild函数的原子函数中。 – 2016-12-26 13:33:13