2016-06-29 7 views
15

を使用する必要があるとき、私はFirebase取引がその古い値と新しい値あなたがFirebase取引

与え、いくつかの値のアトミック更新を可能にする。しかしFirebaseがリアルタイムデータベースであることを考えると、私は仮定し、1はトランザクションだけを使用しなければならないことを理解し控えめにしていない「リアルタイム機能」

にここに例を示します

  1. 私はあなたが(追加すると、「好き」または同等の)値にいくつかの数学的な操作を実行している場合、それは使用するために理にかなっていることを理解トランザクション

  2. 以下のユースケースでトランザクションを使用することが理にかなっているかどうかはわかりません。テキストフィールドは任意の数のユーザーによって更新でき、リアルタイムで発生するすべての更新に関心があるとします。 firebaseはこの場合に取引を使用することを推奨していますか?または、Firebaseサーバの時計のタイムスタンプ単位ごとに1つの「永続的な操作」に限定された、値で発生する最後の「永続操作」ですか?

最終的な値が維持された順序でイベントが配信されることが保証されていますか?

答えて

14

データベースでトランザクションを使用するたびに、データの一貫性を保証するために、スケーラビリティの一部を犠牲にします。 Firebaseデータベースのトランザクションは、開発者がより高度に同時の状況でFirebaseを使用する傾向がある場合を除いて、違いはありません。

トランザクションシステムの場合:システムをスケーラブルに保つための鍵は、同じデータを更新することを競合するクライアントの数を最小限に抑えることです。 Firebaseの場合は、JSONツリーでトランザクションをできるだけ低く実行することでこれを達成できます。私。カウンターはトランザクションの下でうまくいくものの例です。

テキスト編集の例のように、データを大きくすると、トランザクションを使用した場合のスケールがうまく調整されません。そのようなユースケースの場合、矛盾を完全に回避する方法を見つける方が良いでしょう。多くの場合、これは、更新された状態を保存する代わりに、各ユーザーが作成しているデルタを格納することになります。これの大きな例は、Firepad exampleにあります。運用変換を使用して、Firebaseデータベースの上に並行して高度なコラボレーションエディタを作成しています。

+0

はいトランザクションを使用するつもりはありません。ここに例があります。 「コメント」システムを想定します。一意のプッシュキー+いくつかの属性を持つ「コメント」ルートノードにすべてのコメントを保存できます。このルートは大きくなり、ソートされたリストを取得したいのであれば、ソートパラメータ(タイムスタンプ上)を使ってクエリを送信します。最新のコメントの一意のプッシュキーを格納する別のノード:CommentLatestがある場合。したがって、各クライアントは2つの書き込みを実行します。一意のプッシュキーを持つ「コメント」ツリーへの書き込みと、それまでに使用した最新の一意のプッシュキーを持つコメントのツリーへの更新。この規模ですか? – wrecktangle

+0

(続き)、複数のクライアントがcommentLatestノードを更新すると、CommentLatestノードで破損する可能性がありますか? – wrecktangle

+1

'latestCommentId'値の更新の懸念が気になる方は、時期尚早に最適化しているかもしれません。古い日付での上書きは、 'latestCommentId'の値としてタイムスタンプを含めることで防ぐことができます。そして、タイムスタンプを却下することは、現在のタイムスタンプより古いです。しかし、私たちは信じられないほど広範な質問からここで非常に詳細なユースケースに行きました。最初にFirebaseトランザクションの作業に時間を費やしてから、コードとセキュリティルールを使ってより具体的な質問をすることをお勧めします。 –

関連する問題