13

これは、「内部の仕組み」の理解できない質問です。

* A *CIDをサポートしていない noSQL データベース(つまり、1 回のトランザクションで複数のオブジェクトのデータを更新/挿入してからロールバックすることはできません) - セカンダリ インデックスを更新するにはどうすればよいですか?

私の理解では、セカンダリ インデックスの同期を維持するには (そうしないと、読み取りのために古くなります)、これは同じトランザクションで発生する必要があります。

さらに、インデックスがデータとは異なるホストに存在する可能性がある場合、そのような更新がアトミックに機能するには、分散ロックが存在するか、2 フェーズ コミットが必要です。

しかし、これらのデータベースがマルチオブジェクト トランザクションをサポートしていない場合 (複数のホストにまたがるデータに対して 2 フェーズ コミットを実行しないことを意味します)、B ツリー構造に存在するセカンダリ インデックスがトランザクションから分離されることを保証するためにどのような方法を使用しますか?データは古くありませんか?

4

3 に答える 3

22

これは素晴らしい質問です。

RethinkDB は常に、テーブルのプライマリ インデックス/データと同じホストにセカンダリ インデックスを保存します。結合の場合でも、RethinkDB はクエリをデータにもたらすため、セカンダリ インデックス、プライマリ インデックス、およびデータは常に同じノードに存在します。その結果、2 フェーズ コミットなどの分散ロック プロトコルは必要ありません。

RethinkDB は、限定された一連のトランザクション機能 (単一ドキュメント トランザクション) をサポートしています。1 つのドキュメントに対する変更は、アトミックに記録されます。関連するセカンダリ インデックスの変更もそのトランザクションの一部として記録されるため、変更全体が記録されるか、何も記録されません。

単一のシャードで複数のドキュメントをサポートするように制限されたトランザクション機能を拡張するのは簡単ですが、シャード間でそれを行うのは難しいでしょう (あなたが提起した分散ロックの理由から)。そのため、複数のドキュメントに対してトランザクションを実装しないことにしました。まだ。

お役に立てれば。

于 2013-08-12T20:08:51.050 に答える
3

これはMongoDBの回答です。

ここでのあなたの論理が何であるかはよくわかりません。副次索引の更新は、複数の更新などの複数ステートメントのトランザクションをロールバックできることとは関係ありません。

MongoDB には単一のドキュメントごとにトランザクションがあり、それがインデックスの更新に重要です。これらの操作は、必要に応じてジャーナルを使用して元に戻すことができます。

これは、同じトランザクション内で発生する必要があります。

はい、RDBMS とほぼ同じです。適用するインデックスが多いほど、書き込みが遅くなります。その理由はわかっているようです。

書き込みが発生すると、MongoDB はそのコレクションに適用されるすべてのインデックスを、特定のインデックスに適用されるフィールドで更新します。

さらに、インデックスがデータとは異なるホストに存在する可能性がある場合

MongoDB がそれを許可しているかどうかはわかりませんが、そのための JIRA があると思います。ただし、現在そのJIRAは見つかりません。

その場合、そのような更新がアトミックに機能するには、分散ロックが存在するか、2 フェーズ コミットが必要です。

最も可能性が高い。この機能を許可すると...まあ、毛玉を作成するとしましょう。

分割されたセットアップでも、各範囲のインデックスは構成サーバーではなく、分割自体に存在します。

ただし、これらのデータベースがマルチオブジェクト トランザクションをサポートしていない場合 (つまり、複数のホストにまたがるデータに対して 2 フェーズ コミットを実行しないことを意味します)。

これは、2 フェーズ コミットが意味するものではありません。2 フェーズ コミットとは何かを理解する必要があると思います: http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/

複数のシャードを対象とするトランザクションについて話しているのであれば、うーん、わかりました。

データから分離された B ツリー構造に存在するセカンダリ インデックスが古くないことを保証するために、彼らはどのような方法を使用しますか?

複数のドキュメント トランザクションがインデックスが古くなるかどうかに影響を与える理由はわかりません。ドキュメント間でグループ化することはできません。例外は一意のインデックスですが、単一のドキュメントの更新でも機能します。その一意性は、分割されたセットアップではやや複雑になり、保証できないことに注意してください.

作成しているインデックスでは、通常、ドキュメントのプレフィックス キーごとに 1 つのエントリです。ドキュメントのマルチキー インデックスでない限り、複数のインデックスを作成できます。ただし、どちらの方法でも、インデックスの更新はマルチ ドキュメントではなく、単一のオブジェクトごとに行われます。これが私が出した答えです。

于 2013-08-10T20:36:02.777 に答える