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

MongoDB 4.0トランザクション:ACID読み取り+書き込み?

    簡単な答えは、原子性については「はい」です。

    MongoDBでは、トランザクション (マルチドキュメントトランザクションとも呼ばれます)は、セッション に関連付けられています 。つまり、セッションのトランザクションを開始します。いつでも、最大で1つ セッションのトランザクションを開きます。

    コレクション全体を書き込み用にロックすることはできません。複数のトランザクションを作成して、書き込みがプロセス間でインターレース/オーバーライドされないようにすることができます。 MongoDBは、オプティミスティックロック を使用します ペシミスティックロック の代わりに 。

    同様に、MongoDBマルチドキュメントトランザクションでも。たとえば、 mongoshell を使用します :

    s1 = Mongo().startSession() 
    sessionTest = s1.getDatabase("databaseName").test;
    s1.startTransaction() 
    sessionTest.find({a:"foo"})
    > {_id: ObjectId(..), a:"foo", b:1}
    
    // Let's update the record outside of the session (i.e. another process)
    db.test.update({a:"foo"}, {$set:{b:2}})
    
    sessionTest.update({a:"foo"}, {$set:{b:9}})
    // You'll get a WriteConflict error because the the document has been modified outside of the session. 
    

    また、トランザクションが開いている間は、トランザクション内の操作によって行われたデータ変更はトランザクション外には表示されないことに注意してください。

    • トランザクションがコミットされると、すべてのデータ変更が保存され、トランザクションの外部に表示され、トランザクションが終了します。
    • トランザクションが中止されると、トランザクションへの書き込みによって行われたすべてのデータ変更は、表示されることなく破棄され、トランザクションは終了します。

    原子性の例 も参照してください。 。

    MongoDBは分散データベース であることに注意してください。 、したがって、一貫性のためのさまざまなオプションにも注意する必要があります。これらのオプションは、 Session.startTransaction()を開始するときに指定できます。 ユースケースに応じて:

    マルチドキュメントトランザクションは、読み取り設定プライマリ をサポートします また、特定のトランザクションのすべての操作は、同じメンバーにルーティングする必要があります。

    Engineering Chalk and Talks:MongoDBTransactions にも興味があるかもしれません。 MongoDBトランザクションの背後にある技術的な説明を含むビデオ。




    1. MongoDbで友達の友達を見つけるためのグラフデータベースとして使用する

    2. mongodb $ pull /$pullAll修飾子を非配列に適用できません。配列要素を削除する方法

    3. MongoDB:過去24時間に作成されたドキュメントのみをフェッチしますか?

    4. Async、Callbacks、Closure、Oh My