在Firebase中执行扇出数据的事务

kam*_*il1 2 nosql firebase firebase-realtime-database

我正在创建一个社交网络式的Feed,并且一直在关注Firebase博客上的指南,在整个数据库中散布我的"博客帖子".

这很有意义,适用于使用update()方法与这些帖子进行交互.但是,我不清楚如何在多个地方以原子方式执行交易.

例如,我想添加"喜欢"帖子的功能.如果我要在一个位置发布该帖子,我的代码将如下所示:

var postRef = firebaseDB.ref("posts/" + postID + "/likes");
postRef.transaction(function(likes) {
    return (likes || 0) + 1;
});
Run Code Online (Sandbox Code Playgroud)

出于显而易见的原因,以下解决方案不是原子的.

var postRef1 = firebaseDB.ref("posts/" + postID + "/likes");
postRef1.transaction(function(likes) {
    return (likes || 0) + 1;
});

var postRef2 = firebaseDB.ref("user/" + userID + "/posts/" + postID + "/likes");
postRef2.transaction(function(likes) {
    return (likes || 0) + 1;
});
Run Code Online (Sandbox Code Playgroud)

由于交易在ref上运行,我如何能够原子地"喜欢"多个地方的帖子?

Leb*_*ses 5

对于您的用例,在写入队列任务的节点时,您需要在客户端上使用具有限制的 firebase-queue .

您的扇出发生在工作节点中,您可以根据承诺成功/失败构建补偿模型.

queue是保证工作完成并简化客户端代码的唯一方法.

参考:没有交易的生活方式

=========

编辑:2017年3月引入了Firebase的云功能,现在是实施扇出的推荐方法.