Mongodb 4.0のモノロジー酸トランザクションサポートの詳細な説明
(この記事はMongodbと協力して作成されました。SitePointを可能にしたパートナーへのサポートに感謝します。 MongoDB 4.0は、マルチドキュメント酸トランザクションのサポートを追加します。しかし、これはMongodbが以前にトランザクションをサポートしていなかったことを意味しますか?そうではありませんが、MongoDBは常に単一のドキュメントトランザクションをサポートしてきました。 MongoDB 4.0は、これらのトランザクションを複数のドキュメント、複数のステートメント、複数のコレクション、および複数のデータベースに拡張できることを保証します。何らかの形のトランザクションデータの整合性保証がなければ、データベースは他に何が役立ちますか?
この記事に飛び込む前に、ここですべてのコードを見つけて、マルチドキュメント酸トランザクションを試すことができます。
キーポイント
MongoDB 4.0では、複数のドキュメント、ステートメント、コレクション、およびデータベースにトランザクション保証を拡張するマルチドキュメント酸トランザクションを導入し、それによりデータの整合性と一貫性を高めます。
ステップ1:Mongodb LocalHostのポート27017で、少なくともバージョン4.0.0で単一ノードMongoDBレプリカセットを開始します。
docker:を使用する場合
を使用できます。
完了したら、
を使用できます。start-mongo.sh
を使用できます。 stop-mongo.sh
手動でmongodを開始したい場合:connect-mongo.sh
mkdir /tmp/data && mongod --dbpath /tmp/data --replSet rs
mongo --eval 'rs.initiate()'
。
変更ストリームを使用すると、MongoDBコレクションまたはデータベースのデータ変更の通知を受信できます。
ChangeStreams.java
トランザクションプロセスは、デモンストレーション自体です。 Transactions.java
2番目のシェル:
Dockerを使用していない場合は、Maven 3.5.xとJDK 10(またはJDK 8の最小バージョンをインストールする必要がありますが、Javaバージョンを
に更新する必要があります):./compile-docker.sh ./change-streams-docker.sh
最初のシェル:
./compile-docker.sh ./change-streams-docker.sh
2番目のシェル:
./transactions-docker.sh
既存の単一ドキュメントトランザクションをMongoDB 4.0の酸互換マルチドキュメントトランザクションと比較し、Javaを使用してこの新しい機能を活用する方法を学びましょう。
MongoDB 4.0 <MongoDB 3.6以前でも、各書き込み操作は、単一のドキュメントレベルでストレージレイヤーでスコープされたトランザクションとして表されます。ドキュメントモデルは関連するデータを組み合わせており、それ以外の場合は表形式スキーマのさまざまな親子テーブル全体でモデリングするため、MongodbのAtomic Single Document操作は、ほとんどのアプリケーションのデータ整合性ニーズを満たすトランザクションセマンティクスを提供します。 複数のドキュメントを変更する各典型的な書き込み操作は、実際にいくつかの独立したトランザクションで発生します。ドキュメントごとに1つのトランザクションです。
非常にシンプルな在庫管理アプリケーションを例にとってみましょう。
まず、MongoDBレプリカセットが必要なので、上記のようにMongoDBを起動してください。
次のドキュメントを製品コレクションに挿入しましょう。
プロモーションが進行中であると仮定して、お客様にすべての製品の20%の割引を提供したいと考えています。
しかし、この割引を適用する前に、Mongodbでこれらの操作が発生する期間を監視するために、変更ストリームを使用します。
./compile.sh ./change-streams.sh
このシェルを脇に置いておき、別のマンゴのシェルを開いて割引を適用してください:
ご覧のとおり、両方のドキュメントは単一のコマンドラインを使用して更新されますが、1つのトランザクションでは更新されません。これが私たちがChange Streamシェルで見たものです:
./transactions.sh
ご覧のとおり、2つの操作のクラスター時間(
キーを参照)は異なります。これらの操作は同じ秒以内に発生しますが、タイムスタンプのカウンターは1で増加します。MongoDB Enterprise rs:PRIMARY> db.product.insertMany([ { "_id" : "beer", "price" : NumberDecimal("3.75"), "stock" : NumberInt(5) }, { "_id" : "wine", "price" : NumberDecimal("7.5"), "stock" : NumberInt(3) } ])
ここでは、これが非常に迅速に行われたとしても、1つを1つずつ更新してください。他の人は、更新が実行されている間にドキュメントを読み、製品の1つだけが割引があることを確認できます。
ほとんどの場合、これはMongoDBデータベースで許容できるものです。これは、密接に関連するまたは関連するデータを可能な限り同じドキュメントに埋め込もうとするためです。したがって、同じドキュメントの2つの更新が1つのトランザクションで発生します。cursor = db.product.watch([{$match: {operationType: "update"}}]); while (!cursor.isExhausted()) { if (cursor.hasNext()) { print(tojson(cursor.next())); } }
clusterTime
MongoDBでの多体文書化された酸トランザクションは、従来のリレーショナルデータベースから学んだことと非常によく似ています。
MongoDBトランザクションは、原子的または完全にまったくない実行方法で原子的または完全に巻かれなければならない関連する会話操作です。
PRIMARY> db.product.updateMany({}, {$mul: {price:0.8}}) { "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 } PRIMARY> db.product.find().pretty() { "_id" : "beer", "price" : NumberDecimal("3.00000000000000000"), "stock" : 5 } { "_id" : "wine", "price" : NumberDecimal("6.0000000000000000"), "stock" : 3 }
トランザクションは、複数のコレクションまたはデータベースにわたって操作がアトミックであることを保証するために使用されます。したがって、Snapshot Isolation Readsを使用すると、別のユーザーはすべてのアクションまたはアクションなしのみを確認できます。
私たちの例にショッピングカートを追加しましょう。 この例では、2つの異なるビジネスエンティティを扱っているため、2つのコレクションが必要です。各クライアントがショッピング中に作成できるカートです。これらのコレクションの各ドキュメントには、ライフサイクルが異なります。
。 。
これを確保するには、クライアントカートの作成または更新の操作がインベントリアップデートを使用してアトミックであることを確認する必要があります。これは、マルチドキュメントトランザクションが登場する場所です。誰かが私が持っていない在庫のないものを購入しようとする場合、トランザクションは失敗する必要があります。製品在庫に制約を追加します:
私の投稿を読むのに時間を割いてくれてありがとう - あなたがそれが便利で面白いと思うことを願っています。リマインダーとして、すべてのコードは、このGitHubリポジトリに実験するために見つけることができます。 非常に簡単な方法を探している場合は、クラウドのMongodb Atlasデータベースサービスでわずか5クリックで実行できます。
以上がJavaおよびMongoDB 4.0マルチドキュメント酸トランザクションのサポートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。Product.java
./compile-docker.sh
./change-streams-docker.sh
Cart.java
./transactions-docker.sh
./compile.sh
./change-streams.sh
ChangeStreams.java
...(次のコンテンツには、提供されたコードに基づいてJavaコードスニペットと説明を補充する必要があります。長さは長すぎて省略しています)....