ホームページ > テクノロジー周辺機器 > IT業界 > JavaおよびMongoDB 4.0マルチドキュメント酸トランザクションのサポート

JavaおよびMongoDB 4.0マルチドキュメント酸トランザクションのサポート

Lisa Kudrow
リリース: 2025-02-16 12:36:13
オリジナル
156 人が閲覧しました

Mongodb 4.0のモノロジー酸トランザクションサポートの詳細な説明

Java and MongoDB 4.0 Support for Multi-document ACID Transactions

(この記事はMongodbと協力して作成されました。SitePointを可能にしたパートナーへのサポートに感謝します。 MongoDB 4.0は、マルチドキュメント酸トランザクションのサポートを追加します。しかし、これはMongodbが以前にトランザクションをサポートしていなかったことを意味しますか?そうではありませんが、MongoDBは常に単一のドキュメントトランザクションをサポートしてきました。 MongoDB 4.0は、これらのトランザクションを複数のドキュメント、複数のステートメント、複数のコレクション、および複数のデータベースに拡張できることを保証します。何らかの形のトランザクションデータの整合性保証がなければ、データベースは他に何が役立ちますか?

この記事に飛び込む前に、ここですべてのコードを見つけて、マルチドキュメント酸トランザクションを試すことができます。

キーポイント

MongoDB 4.0では、複数のドキュメント、ステートメント、コレクション、およびデータベースにトランザクション保証を拡張するマルチドキュメント酸トランザクションを導入し、それによりデータの整合性と一貫性を高めます。

    MongoDB 4.0の前に、MongoDBは単一のドキュメントトランザクションをサポートし、単一のドキュメント内の原子動作を確保し、ほとんどのアプリケーションに適しています。
  • MongoDB 4.0マルチドキュメント酸トランザクションは、より複雑な操作における原子性、一貫性、分離、および持続性を提供する従来のリレーショナルデータベーストランザクションと一致しています。
  • マルチドキュメント酸トランザクションを使用するための設定
  • 設定には、MongoDB Replicasetの起動、必要な依存関係を備えたJava環境のセットアップ、および提供されたスクリプトを通じてトランザクション操作の実行が含まれます。
  • この記事の実際のデモンストレーションは、在庫の可用性に基づいてトランザクションがコミットまたはロールバックされ、データベース状態の一貫性を確保するシナリオなど、マルチドキュメントトランザクションの実装を示しています。
  • クイックスタート

ステップ1:Mongodb LocalHostのポート27017で、少なくともバージョン4.0.0で単一ノードMongoDBレプリカセットを開始します。

docker:を使用する場合

を使用できます。

完了したら、

を使用できます。
  • Mongo Shellを使用してMongodbに接続する場合は、start-mongo.shを使用できます。
  • stop-mongo.sh手動でmongodを開始したい場合:
  • connect-mongo.sh

  • mkdir /tmp/data && mongod --dbpath /tmp/data --replSet rs
  • ステップ2:Javaを開始
  • mongo --eval 'rs.initiate()'
  • このデモには、2つの主要なプログラムが含まれています:

変更ストリームを使用すると、MongoDBコレクションまたはデータベースのデータ変更の通知を受信できます。

ChangeStreams.javaトランザクションプロセスは、デモンストレーション自体です。 Transactions.java

    それらを実行するには2つのシェルが必要です。
  • docker:
  • を使用する場合
  • 最初のシェル:

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 4.0マルチドキュメント酸トランザクションを使用した

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つのコレクションが必要です。各クライアントがショッピング中に作成できるカートです。これらのコレクションの各ドキュメントには、ライフサイクルが異なります。

製品コレクションのドキュメントは、私が販売しているアイテムを示しています。これには、製品の現在の価格と現在の在庫が含まれます。私はそれを表すためにポジョを作成しました:

Product.java

./compile-docker.sh
./change-streams-docker.sh
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
クライアントが最初のアイテムをカートに追加すると、カートが作成され、クライアントがWebサイトをチェックアウトまたは出発し続けると、カートが削除されます。私はそれを表すためにポジョを作成しました:

Cart.java

./transactions-docker.sh
ログイン後にコピー
ログイン後にコピー
ここでの課題は、私が持っている以上に販売できないということです。販売する5つのビールがあれば、さまざまなクライアントのショッピングカートに5つ以上のビールを持つことはできません。

これを確保するには、クライアントカートの作成または更新の操作がインベントリアップデートを使用してアトミックであることを確認する必要があります。これは、マルチドキュメントトランザクションが登場する場所です。誰かが私が持っていない在庫のないものを購入しようとする場合、トランザクションは失敗する必要があります。製品在庫に制約を追加します:

./compile.sh
./change-streams.sh
ログイン後にコピー
ログイン後にコピー
(これは既にJavaコードに含まれていることに注意してください。)

例を監視するには、MongoDB 3.6で導入されたMongoDB変更ストリームを使用します。

と呼ばれるこのプロセスの各スレッドでは、2つのコレクションのいずれかを監視し、各操作とそれに関連するクラスター時間を印刷します。

ChangeStreams.java...(次のコンテンツには、提供されたコードに基づいてJavaコードスニペットと説明を補充する必要があります。長さは長すぎて省略しています)....

次のステップ

私の投稿を読むのに時間を割いてくれてありがとう - あなたがそれが便利で面白いと思うことを願っています。リマインダーとして、すべてのコードは、このGitHubリポジトリに実験するために見つけることができます。

非常に簡単な方法を探している場合は、クラウドのMongodb Atlasデータベースサービスでわずか5クリックで実行できます。

さらに、Mongodb 4.0のマルチドキュメント酸トランザクションは唯一の新機能ではないので、Mongodb UniversityのMongoDB 4.0の新機能とツール、Mongodbの新機能に関する無料のコースM040:新機能とツールを自由にチェックしてください4.0、ネイティブタイプの変換、新しい視覚化および分析ツール、およびKubernetesの統合について詳しく知ることができます。

...(次のコンテンツはFAQです。記事は長すぎます、ここでは省略しています)....

以上がJavaおよびMongoDB 4.0マルチドキュメント酸トランザクションのサポートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート