簡単な答えは、原子性については「はい」です。
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は
-
Read Isolation(Read Concern) :MongoDBマルチドキュメントトランザクションは、読み取りの懸念をサポートします "スナップショット "、" local "、および" majority "。
マルチドキュメントトランザクションは、読み取り設定プライマリ をサポートします また、特定のトランザクションのすべての操作は、同じメンバーにルーティングする必要があります。
Engineering Chalk and Talks:MongoDBTransactions にも興味があるかもしれません。 MongoDBトランザクションの背後にある技術的な説明を含むビデオ。