sql >> データベース >  >> NoSQL >> MongoDB

MongoDBの原子性、分離、並行性

    今日最も人気のあるリレーショナルデータベースは、「 ACID」をサポートしています。 」プロパティ–原子性、一貫性、分離性、耐久性。リレーショナルデータベースを使用する開発者とDBA(データベース管理者)は、ACIDの動作をよく理解しています。ただし、MongoDBクラウドなどのNoSQLデータベースを使用する場合、理解することが重要ないくつかの重要な違いがあります。 MongoDBは、ストレージ、スキーマ、スケーリングに優れた柔軟性を提供しますが、ACIDプロパティの一部を緩和します。データをモデル化してMongoDBコマンドを実行するときは、違いを理解することが不可欠です。

    アトミシティ

    ウィキペディアでは、「原子性」を次のように定義しています–「不可分操作 、一連のデータベース操作すべて 発生する、または何もない 発生します。原子性の保証は、データベースへの更新が部分的にのみ発生することを防ぎます。これにより、シリーズ全体を完全に拒否するよりも大きな問題が発生する可能性があります。つまり、原子性とは不可分性を意味します。 および還元不可能性」。

    MongoDBの書き込み操作はアトミックであり、単一のドキュメントのレベルでのみ行われます。ドキュメント内の複数のサブドキュメントを変更する場合、操作は引き続きアトミックですが、複数のドキュメントを変更する場合、操作はアトミックではありません。では、複数のドキュメント間でどのようにアトミックな動作を実現しますか?目的のアトミック性を実現するには、「2フェーズコミット」パターンを使用する必要があります。これは、このパターンを実装する方法に関するMongoDBドキュメントの優れた例です。 2フェーズコミットパターンは、実装して正しく行うのが簡単ではありません。したがって、複数のドキュメントの書き込みアトミック性が狙いを定めていることを確認してください。

    分離

    ウィキペディアでは、「分離」を次のように定義しています–「データベースシステムでは、分離 は、ある操作によって行われた変更が他の同時操作に表示される方法とタイミングを定義するプロパティです。」 MongoDB操作で分離を実現するには、次のような複数の方法があります。

    1. 「findAndModifyOperation()」コマンド

      これは、既存のドキュメントをクエリおよび変更する最も簡単な方法の1つです。このコマンドは、ドキュメントの以前の値またはドキュメントの新しく更新された値のいずれかを返すことができます。一致するドキュメントを並べ替えたり、アップサートしたり、返す必要のあるフィールドを選択したりすることもできます。

      db.collection.findAndModify( {
                                     query: <document>,
                                     sort: <document>,
                                     remove: <boolean>,
                                     update: <document>,
                                     new: <boolean>,
                                     fields: <document>,
                                     upsert: <boolean>
                                 } );
    2. 「現在の場合は更新」パターン

      このパターンは、MongoDBドキュメントで指定されています。手作業が増えますが、より細かく制御できます。

    3. $isolation演算子

      $ isolation演算子は、複数のドキュメントへの書き込みを分離する方法を提供します。ただし、$ isolation演算子は、オールオアナッシングの保証を提供しません。これを実現するには、最初のセクションで指定された原子性手法のいくつかを使用する必要があります。また、$isolation演算子はシャードに対しては機能しません。このコマンドは以前は「$atomic」と呼ばれていましたが、現在は「$isolated」に正しく名前が変更されています。

    同時実行性

    MongoDBはロックを使用して、複数のクライアントが同じデータを同時に更新するのを防ぎます。 MongoDB 2.2+は、「データベース」レベルのロックを使用します。したがって、1つの書き込み操作でデータベースがロックされると、同じデータベースへの他のすべての書き込み操作は(別のコレクションへの場合でも)ロックを待機してブロックされます。 MongoDBは、読み取りよりも書き込みを優先する「ライター欲張り」ロックを使用します。 2.2以降では、特定の長時間実行操作によってロックが発生する可能性があります。

    スレッドセーフ

    すべてのMongoDBクライアントクラスがスレッドセーフであるとは限りません。使用しているクラスがスレッドセーフであるかどうかを確認するには、特定のドライバーのドキュメントを参照してください。たとえば、Javaドライバーでは、MongoClientクラスはスレッドセーフです。したがって、すべてのスレッドでこのクラスの単一のインスタンスを使用できます。内部的には、MongoClientは接続プールを使用してMongoDBサーバーへの接続を管理します。

    いつものように、ご不明な点がございましたら、[email protected]までお問い合わせください。


    1. redisで独自のデータベースを作成するにはどうすればよいですか?

    2. ダンプされたデータをmongodumpで使用するにはどうすればよいですか?

    3. Redis:n個のネイバーキーを並べ替えて取得する

    4. Mongoでnullではないことをどのようにクエリしますか?