Firebase:如何以primefaces方式更新多个资源?

Firebase允许以事务方式更新资源。 据我了解,客户这样做是购买发送请求到服务器说:“如果旧的价值是X,使新的价值Y”。 如果存在争用,服务器可以拒绝来自客户端的多个更新,直到被接受为止。

现在,如果我想要自动更新多个资源呢?

如果第一次更新被接受,会发生什么情况,然后客户端在第二次更新被接受之前断开连接。 有没有办法在一个primefaces事务中包含多个更新? 如果没有,这个问题是否有一个习惯性的解决scheme?

UPDATE

现在可以自动更新多个位置。 有关详细信息,请参阅此博文 。

var mergedUpdate = {}; mergedUpdate[ 'users/' + userId + '/widgets/' + widgetId ] = true; mergedUpdate[ 'widgets/' + widgetId ] = widgetData; var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/"); ref.update(mergedUpdate); 

这不强制执行事务数据(如果当前值为X,则为Y),但是这部分可以移至安全规则 。 例如,如果我们想同时更新两个计数器,我们可以添加如下的规则:

 { "counter1": { ".validate": "newData.val() === (data.val()||0)+1" }, "counter2"1 { ".validate": "newData.val() === (data.val()||0)+1" } } 

现在我们可以尝试与上面相同的多path更新。 如果自从我们上次从服务器读取这些值后这些值已经发生变化,则尝试将失败。 我们可以检查if( error.code === 'PERMISSION_DENIED' ) { ... }以查看失败是否由于validation,并相应地重试。

原来的post

这样做的唯一方法是在共同的祖先上运行交易。

例如,如果要更新/ a / b / c和/ a / x / y,则可以在/ a处运行事务并更改这两个值。

这种方法的不足之处在于,对于networkingI / O来说,这可能是昂贵的,因为交易中的所有数据都需要下载并发送回服务器。

您可能需要考虑的更复杂但潜在更强大的方法是重构数据,以便不存储实际值,而是存储编辑的历史logging。 例如,如果您要存储银行余额信息,则可以存储存款和取款的历史logging。 那么当你想获得平衡时,你会回放整个历史并计算最终的平衡。

这种方法的优点是它可以让你做primefaces更新。 例如,如果您从账户A转账到账户B,您只需在日志末尾附加一个元素,即“从账户A转账到账户N元”。 附加单个元素是一个primefaces操作。

这是我们的协作文本编辑器Firepad所采用的方法。

还有另外一种方式……非常乏味……而且不是真正的交易…

由于Firebase允许对值进行primefaces上的更改,因此可以创build一个locking或信号量,其含义是“在资源x,y和z上启动事务”。当然,这不是一个真正的事务,因为它不阻止资源,从锁的一部分。 我们可以按惯例称之为交易。 客户端需要知道,当锁被占用时,他们不应该改变x,y和z资源。