Overview
このガイドでは、Java ドライバーを使用してトランザクションを実行する方法を学習します。 トランザクションを使用すると、トランザクションがコミットされるまでデータを変更しない一連の操作を実行できます。 トランザクション内のいずれかの操作でエラーが返された場合、ドライバーはトランザクションをキャンセルし、変更が反映される前にすべてのデータ変更を破棄します。
MongoDBでは、トランザクションは論理 セッション 内で実行されます。セッションは 、順番に実行されるよう関連付けられた読み取り操作または書き込み操作のグループです。セッションを使用すると、 ACID準拠のトランザクションで操作を実行できます。これは、アトミック性、整合性、分離、耐久性の期待を満たすトランザクションです。
Java ドライバーを使用すると、 MongoClient
インスタンスからClientSession
型の新しいセッションを作成できます。 毎回新しいクライアントをインスタンス化するのではなく、クライアントを複数のセッションやトランザクションで再利用することを推奨します。
警告
ClientSession
は、それを作成した MongoClient
(または関連付けられたMongoDatabase
または MongoCollection
)でのみ使用します。ClientSession
と、異なる MongoClient
を使用すると、操作エラーが発生します。
重要
トランザクションに含める操作のパラメーターとしてsession
を含める必要があります。
因果整合性
MongoDB は特定のクライアントセッションで因果整合性を有効にします。因果整合性モデルは、分散システム内でセッション内の操作が因果順序で実行されることを保証します。クライアントは、因果関係、または操作間の依存関係と整合性のある結果を観察します。例、ある操作が別の操作の結果に論理的に依存する一連の操作を実行すると、後続のすべての読み取りは 依存関係を反映します。
因果整合性を保証するには、クライアントセッションが次の要件を満たす必要があります。
セッションを開始するとき、ドライバーは 因果整合性 オプションを有効にする必要があります。このオプションはデフォルトで有効になっています。
操作は 1 つのスレッド上の 1 つのセッションで実行する必要があります。それ以外の場合、セッションまたはスレッドは optime とクラスター時間の値を相互に通信する必要があります。 これらの値を通信する 2 つのセッションの例については、 MongoDB Serverマニュアルの 因果整合性の例 を参照してください。
MAJORITY
の読み取り保証 (read concern)を使用する必要があります。MAJORITY
の書込み保証 (write concern)を使用する必要があります。これは、デフォルトの書込み保証 (write concern)の値です。
次の表では、因果整合性のあるセッションが提供する保証について説明しています。
保証 | 説明 |
---|---|
書込み操作の結果を読み取る | 読み取り操作は、前の書込み操作の結果を反映します。 |
単調な読み取り | 読み取り操作では、前の 読み取り操作よりも前のデータ状態を反映した結果は返されません。 |
単調書込み | 書込み操作が他の書込み操作に優先する必要がある場合、サーバーはこの書込み操作を最初に実行します。 例、 |
書込み操作の前に読み取り操作をする | 書込み操作が他の読み取り操作の後に続く必要がある場合、サーバーは最初に読み取り操作を実行します。 例、 |
Tip
このセクションで述べられた概念の詳細については、次のMongoDB Serverマニュアル エントリを参照してください。
メソッド
MongoClient
インスタンスでstartSession()
メソッドを使用してClientSession
を作成します。 次に、 ClientSession
が提供するメソッドを使用して、セッション状態を変更できます。 次の表では、トランザクションを管理するために使用できる方法について説明します。
方式 | 説明 |
---|---|
| Starts a new transaction for this session with the
default transaction options. Pass an instance of TransactionOptions
as a parameter to start a transaction with given options. You
cannot start a transaction if there's already an active transaction
running in the session.Parameter: TransactionOptions transactionOptions |
| Ends the active transaction for this session. Returns an error
if there is no active transaction for the
session or the transaction was previously ended. |
| Commits the active transaction for this session. Returns an
error if there is no active transaction for the session or if the
transaction was ended. |
| Starts a new transaction for this session and runs the given function. This
method handles retries, committing, and aborting transactions. Pass an
instance of TransactionBody as a parameter that defines the
operations you want to execute within the transaction.Parameter: TransactionBody<T> transactionBody |
ClientSession
には、セッション プロパティを取得し、可変セッション プロパティを変更するメソッドもあります。 これらのメソッドの詳細については、 API ドキュメントを表示します。
Tip
トランザクション タイムアウト
トランザクション内で操作が完了するまでにかかる時間の制限を設定できます。詳しくは、「 サーバー実行時間制限 」ガイドの「 トランザクション 」セクションを参照してください。
例
次の例は、以下の手順でセッションを作成し、トランザクションを作成し、複数のドキュメント挿入操作をコミットする方法を示しています。
startSession()
メソッドを使用してクライアントからセッションを作成します。トランザクションの動作を構成するには、 トランザクションオプション を設定します。
トランザクションを開始するには、
withTransaction()
メソッドを使用します。複数のドキュメントを挿入します。
withTransaction()
メソッドはトランザクションを実行、コミット、中止します。 いずれかの操作でエラーが発生した場合、withTransaction()
がトランザクションのキャンセルを取り扱います。
String connectionString = "<connection string>"; // Replace with your connection string try (MongoClient mongoClient = MongoClients.create(connectionString)) { MongoDatabase database = mongoClient.getDatabase("transaction_db"); MongoCollection<Document> collection = database.getCollection("books"); // Sets transaction options TransactionOptions transactionOptions = TransactionOptions.builder() .writeConcern(WriteConcern.MAJORITY) .build(); try (ClientSession session = mongoClient.startSession()) { // Uses withTransaction and lambda for transaction operations session.withTransaction(() -> { collection.insertMany(session, Arrays.asList( new Document("title", "The Bluest Eye").append("author", "Toni Morrison"), new Document("title", "Sula").append("author", "Toni Morrison"), new Document("title", "Song of Solomon").append("author", "Toni Morrison") )); return null; // Return value as expected by the lambda }, transactionOptions); } } catch (Exception e) { e.printStackTrace(); }
トランザクションをさらに制御する必要がある場合は、 startTransaction()
メソッドを使用できます。 このメソッドを前のセクションで説明した メソッドとcommitTransaction()
abortTransaction()
メソッドと組み合わせて使用すると、トランザクションのライフサイクルを手動で管理できます。
注意
並列操作はサポートされていません
Javaドライバーは、単一のトランザクション内での並列操作の実行中をサポートしていません。
詳細情報
このガイドで言及されている概念の詳細については、サーバー マニュアルの次のページを参照してください。
ACID compliance の詳細については、 「 データベース管理システムの ACID プロパティとは 」を参照してください。 MongoDB Webサイトの記事。
API ドキュメント
このガイドで説明した型やメソッドの詳細については、次の API ドキュメントを参照してください。