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

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 までご連絡ください。
2025年に購読する上位21の開発者ニュースレター2025年に購読する上位21の開発者ニュースレターApr 24, 2025 am 08:28 AM

これらのトップ開発者ニュースレターを使用して、最新のハイテクトレンドについてお知らせください! このキュレーションされたリストは、AI愛好家からベテランのバックエンドやフロントエンド開発者まで、すべての人に何かを提供します。 お気に入りを選択し、Relを検索する時間を節約してください

AWS ECSとLambdaを備えたサーバーレス画像処理パイプラインAWS ECSとLambdaを備えたサーバーレス画像処理パイプラインApr 18, 2025 am 08:28 AM

このチュートリアルは、AWSサービスを使用してサーバーレスイメージ処理パイプラインを構築することをガイドします。 APIゲートウェイ、Lambda関数、S3バケット、およびDynamoDBと対話するECS Fargateクラスターに展開されたnext.jsフロントエンドを作成します。 th

CNCF ARM64パイロット:インパクトと洞察CNCF ARM64パイロット:インパクトと洞察Apr 15, 2025 am 08:27 AM

このパイロットプログラム、CNCF(クラウドネイティブコンピューティングファンデーション)、アンペアコンピューティング、Equinix Metal、およびActuatedのコラボレーションであるCNCF GithubプロジェクトのARM64 CI/CDが合理化されます。 このイニシアチブは、セキュリティの懸念とパフォーマンスリムに対処します

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、