9

2人以上のユーザーが両方ともオフラインで、同じデータを編集している場合、どちらが勝ちますか?または、さらに良いことに、競合/マージの解決策はありますか?

4

1 に答える 1

14

答えは、データの変更方法によって異なります。

  • set() (および remove、push、setWithPriority など) は最終書き込み優先です。したがって、クライアント A とクライアント B が両方とも「オフライン」であり、後で Firebase に接続する場合、クライアント A が最初に Firebase に正常に接続すると、彼の set() が Firebase に書き込まれますが、クライアント B が最終的に接続されると、彼のセットは、クライアント A のセットを上書きするため、クライアント B が最終的に勝ちます。
  • transaction () には競合解決機能が組み込まれています。したがって、クライアント A が最初に Firebase に接続された場合、彼のトランザクションは最初の試行で成功します (競合がないため)。その後、クライアント B が接続すると、トランザクションは最初の試行で失敗するため、トランザクション更新関数が 2 回目に自動的に実行され (クライアント A が以前に書き込んだ新しいデータに対して)、この新しいデータが Firebase に書き込まれます。 (それ以上の競合がないことを前提としています)。

したがって、誰が勝つかを気にしない場合は、set() を使用してください。競合/マージの解決を通じて何らかの一貫性を確保する必要がある場合は、transaction() を使用してください。

于 2013-02-04T23:48:02.977 に答える