9

如果 2 个或更多用户都处于离线状态并且他们正在编辑相同的数据,那么谁会赢?或者,更好的是,是否存在冲突/合并解决方案?

4

1 回答 1

14

答案取决于他们如何修改数据。

  • set() (以及 remove、push、setWithPriority 等)是最后写入获胜。因此,如果客户端 A 和客户端 B 都“离线”然后连接到 Firebase,如果客户端 A 先成功连接到 Firebase,他的 set() 将被写入 Firebase,但是当客户端 B 最终连接时,他的 set将覆盖客户端 A 的集合,因此客户端 B 最终将获胜。
  • transaction () 具有内置的冲突解决方案。因此,如果客户端 A 先连接到 Firebase,他的事务将在第一次尝试时成功(因为没有冲突)。然后当客户端 B 连接时,他的事务第一次尝试失败,因此他的事务更新功能将自动运行第二次(现在是客户端 A 之前写入的新数据),并将此新数据写入 Firebase (假设没有进一步的冲突)。

因此,如果您不在乎谁赢,请使用 set()。如果您需要通过冲突/合并解决方案确保某种一致性,请使用 transaction()。

于 2013-02-04T23:48:02.977 回答