2016-06-29 29 views
15

据我所知,火力地堡交易使一些价值的原子更新,赋予其旧值和新值什么时候应该使用火力地堡交易

但考虑到火力地堡是一个实时的数据库,我认为,一个只能使用交易谨慎,而不是在“实时功能”

这里有一个例子:

  1. 我明白,如果你在一个值进行一些数学运算(添加“喜欢”或同等学历),这是有道理的使用交易

  2. 我不明白在以下用例中使用事务是否合理:假设任何数量的用户都可以更新文本字段,并且我们对所有更新都感兴趣,因为它们都是实时发生的。 Firebase建议我们在这种情况下使用交易吗?或者,最终的“持续运营”发生在该值上,仅限于Firebase服务器时钟的每个时间戳粒度的单个“持续运营”?

此外,它是保证事件将按最终值的持续顺序传递?

回答

14

每当您在数据库上使用事务时,都会牺牲一些可伸缩性,以获得更强大的数据一致性保证。 Firebase数据库中的交易没有什么不同,除非开发者倾向于在更高度并发的情况下使用Firebase。使用任何事务系统:保持系统可伸缩性的关键是尽量减少争用更新相同数据的客户端的数量。在Firebase的情况下,您可以通过在JSON树中尽可能少地运行事务来实现这一点。即一个柜台就是一个在交易中可以很好运作的例子。

对于较大的数据段(例如文本编辑示例),使用事务处理不能很好地扩展。对于这种用例,最好找到一种方法来完全避免冲突。通常这归结为存储每个用户正在制造的增量,而不是存储更新的状态。一个很好的例子是Firepad example,它使用操作转换在Firebase数据库之上创建高度并发的协作编辑器。

+0

是的我不打算使用交易。这里是一个例子。假设一个“评论”系统。我可以继续使用唯一的按键+某些属性将所有评论存储在“评论”根节点中。这根可以增长很大,如果我想要得到一个排序列表,我会发送一个查询与一些排序参数(时间戳)。如果我有另一个节点:CommentLatest,它存储最新评论的唯一按键。因此,每个客户端都执行两次写入操作:使用唯一的按键写入“Comment”树,并使用刚刚使用的latest = unique push key更新commentlatest树。这是否规模? – wrecktangle

+0

(续)如果有多个客户端更新commentLatest节点,在CommentLatest节点上是否有可能发生损坏? – wrecktangle

+1

如果您担心更新'latestCommentId'值的争用,您可能会过早进行优化。通过将时间戳记作为'latestCommentId'的值并且然后拒绝时间戳比当前时间戳更早,可以防止用较早的日期覆盖。但请注意,我们从一个令人难以置信的广泛问题转到了一个非常详细的用例。您可能首先需要花更多时间处理Firebase交易,然后使用代码和安全规则提出更具体的问题。 –