Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候应该使用Firebase事务_Firebase_Firebase Realtime Database - Fatal编程技术网

什么时候应该使用Firebase事务

什么时候应该使用Firebase事务,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,据我所知,Firebase事务支持对某些值进行原子更新,包括旧值和新值 但是,考虑到Firebase是一个实时数据库,我认为,人们必须谨慎地使用事务,而不是在“实时功能”中使用事务 下面是一个例子: 我理解,如果您正在对一个值执行一些数学运算(添加“likes”或等效值),则使用事务处理是有意义的 我不明白在以下用例中使用事务是否有意义:假设一个文本字段可以被任意数量的用户更新,我们对所有的更新都感兴趣,因为它们是实时发生的。firebase是否建议我们在这种情况下使用事务?或者,值上发生的最终

据我所知,Firebase事务支持对某些值进行原子更新,包括旧值和新值

但是,考虑到Firebase是一个实时数据库,我认为,人们必须谨慎地使用事务,而不是在“实时功能”中使用事务

下面是一个例子:

  • 我理解,如果您正在对一个值执行一些数学运算(添加“likes”或等效值),则使用事务处理是有意义的

  • 我不明白在以下用例中使用事务是否有意义:假设一个文本字段可以被任意数量的用户更新,我们对所有的更新都感兴趣,因为它们是实时发生的。firebase是否建议我们在这种情况下使用事务?或者,值上发生的最终“持久化操作”是否仅限于Firebase服务器时钟的每个时间戳粒度的单个“持久化操作”


  • 此外,是否可以保证事件将按照最终值持久化的顺序交付?

    每当您在数据库上使用事务时,您都会牺牲一些可伸缩性,以获得更强的数据一致性保证。Firebase数据库上的事务没有什么不同,只是开发人员倾向于在更高并发性的情况下使用Firebase

    对于任何事务系统:保持系统可伸缩性的关键是尽量减少争用更新相同数据的客户端数量。对于Firebase,您可以通过在JSON树中尽可能低地运行事务来实现这一点。也就是说,计数器就是在交易中可以正常工作的一个例子


    对于较大的数据块,例如文本编辑示例,使用事务将无法很好地扩展。对于这样的用例,最好找到一种完全避免冲突的方法。通常,这归结为存储每个用户正在生成的增量,而不是存储更新的状态。这方面的一个很好的例子是,它使用operational transform在Firebase数据库上创建一个高度并发的协作编辑器。

    是的,我也不打算使用事务。这里有一个例子。假设一个“评论”系统。我可以继续将所有评论存储在一个“评论”根节点中,并使用一个唯一的按键+一些属性。这个根可能会变大,如果我想得到一个排序列表,我会发送一个带有一些排序参数(在时间戳上)的查询。如果我有另一个节点:CommentLatest,它存储最新评论的唯一按键。因此,每个客户机执行两次写入:一次是使用唯一的按键写入“Comment”树,另一次是使用刚刚使用的最新=唯一的按键更新commentlatest树。这是否会扩展?(续)如果有多个客户端更新CommentLatest节点,CommentLatest节点是否有损坏的可能性?如果您担心更新
    latestCommentId
    值的争用,您可能会过早地进行优化。可以通过将时间戳作为
    latestCommentId
    的值,然后拒绝使用比当前时间戳早的时间戳来防止使用较旧的日期进行覆盖。但是请注意,我们在这里从一个非常广泛的问题变成了一个非常详细的用例。您可能希望首先花更多的时间处理Firebase事务,然后就代码和安全规则提出更具体的问题。@FrankvanPuffelen我想在一个事务中更新多个路径是什么?例如,将资金从一个用户帐户转移到另一个帐户?在许多用例中,并发修改的机会随着数据的大小而增加。并发修改会导致争用(冲突更新),从而导致重试,从而限制并发性和可伸缩性。