AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

トランザクション

このガイドでは、Rust ドライバーを使用してトランザクションを実行する方法を学習できます。 トランザクションを使用すると、トランザクション全体がコミットされた場合にのみ、データを変更する一連の操作を実行できます。 トランザクション内のいずれかの操作が成功しない場合、ドライバーはトランザクションを停止し、変更が反映される前にすべてのデータ変更を破棄します。 この特徴はアトミック性と 呼ばれます。

MongoDB では、トランザクションは論理セッション内で実行されます。 セッションは 、順番に実行されるよう関連付けられた読み取り操作または書き込み操作のグループです。 セッションにより、一連の操作に対する 因果整合性 が有効になり、 ACID 準拠のトランザクション(アトミック性、整合性、分離、耐久性の期待を満たすトランザクション)内で操作を実行できるようになります。 MongoDBは、トランザクション操作で予期せぬエラーが発生した場合でも、その操作に関わるデータの一貫性が保たれることを保証します。

Rust ドライバーを使用すると、 ClientインスタンスからClientSession型の新しいセッションを作成できます。 毎回新しいクライアントをインスタンス化するのではなく、クライアントを複数のセッションやトランザクションで再利用することで、アプリのパフォーマンスを向上させることができます。

警告

ClientSessionは、それを作成したClientで実行されている操作でのみ使用します。 ClientSessionと別のClientを使用すると、操作エラーが発生します。

Clientインスタンスでstart_session()メソッドを使用してClientSessionを作成します。 その後、 ClientSessionタイプが提供するメソッドを使用してセッション状態を変更できます。 次の表では、これらの方法について説明します。

方式
説明

start_transaction()

このセッションで新しいトランザクションを開始します。セッションはトランザクション内の各操作に渡される必要があります。そうしない場合、操作はトランザクションの外で実行されます。

トランザクションオプションは、start_transaction()TransactionOptionsオプションビルダメソッドをチェーンすることで設定できます。

トランザクション内で実行される操作から返されるエラーには、TRANSIENT_TRANSACTION_ERRORラベルが含まれる場合があります。これは、トランザクション全体を終了して再試行することで成功すると予想されることを示しています。

commit_transaction()

このセッションのアクティブなトランザクションをコミットします。セッションにアクティブなトランザクションがない場合、またはトランザクションが以前に終了している場合、このメソッドはエラーを返します。

このメソッドは、コミットされたトランザクションが設定された書込み保証を満たしているかどうか不明であることを示す UNKNOWN_TRANSACTION_COMMIT_RESULT ラベルを含むエラーを返す場合があります。このエラーが発生した場合は、書込み保証 (write concern) が満たされるまで、またはメソッドがラベルなしのエラーを返すまで、安全にコミットを再試行できます。

abort_transaction()

このセッションのアクティブなトランザクションを終了します。 このメソッドは、セッションにアクティブなトランザクションがない場合、またはトランザクションがコミットされたか、または終了した場合は、エラーを返します。

and_run()

指定されたコールバックを実行し、トランザクションをコミットまたは終了します。ドライバーは、TRANSIENT_TRANSACTION_ERROR ラベルでエラーを発生させるコールバックとコミットを再試行します。それらが他のエラーを発生させる場合、ドライバーはトランザクションを終了し、エラーを呼び出し元に返します。このメソッドを使用してトランザクションを実行する場合、ドライバーはあらゆるエラーを自動的に取り扱うため、エラー取り扱いコードを省略できます。

コールバックは将来を返し、複数回実行できるため、キャプチャされた値に対する Rust 言語のクロージャ借用ルールは制限的になる可能性があります。そのため、and_run() メソッドはコールバックに渡されるコンテキストパラメータを受け入れます。

パラメータ: context C, コールバック FnMut(&'a mut ClientSession, &'a mut C)

重要

トランザクションで実行できるメソッド

トランザクション内で MongoDB 操作を実行するには、 session()メソッドを操作に連結する必要があります。 このメソッドは、 ClientSessionインスタンスをパラメータとして受け入れます。

たとえば、ドキュメントを削除するには、通常、 delete_one()メソッドを使用できます。 ただし、トランザクション内でドキュメントを削除するには、 session()メソッドをdelete_one()に連鎖させ、セッションをパラメーターとして渡す必要があります。

次のコードでは、insert_media() コレクションと コレクションにデータを挿入するbooks filmsコールバック関数を定義します。

async fn insert_media(session: &mut ClientSession) -> Result<(), Error> {
let books_coll = session
.client()
.database("db")
.collection::<Document>("books");
let films_coll = session
.client()
.database("db")
.collection::<Document>("films");
books_coll
.insert_one(doc! {
"name": "Sula",
"author": "Toni Morrison"
})
.session(&mut *session)
.await?;
films_coll
.insert_one(doc! {
"name": "Nostalgia",
"year": 1983
})
.session(&mut *session)
.await?;
Ok(())
}

次のコードは、トランザクションを実行するために次のアクションを完了します。

  1. start_session()メソッドを使用してクライアントからセッションを作成します。

  2. トランザクションを開始するには、 start_transaction()メソッドを呼び出します。

  3. トランザクション内でinsert_media()コールバック 関数を実行するためにand_run()メソッドを呼び出します。

let mut session = client.start_session().await?;
session
.start_transaction()
.and_run((), |session, _| insert_media(session).boxed())
.await?;
println!("Successfully committed transaction!");
Successfully committed transaction!

トランザクションをさらに制御する必要がある場合は、 ClientSession APIドキュメント を参照して、トランザクションを手動で作成してコミットする方法を示す例を見つけてください。

注意

並列操作はサポートされていません

Rustドライバーは、単一のトランザクション内での並列操作の実行中をサポートしていません。

MongoDB Server v8.0 以降を使用している場合は、一括書込み操作を使用して、1 つのトランザクション内で複数の名前空間に対して書込み操作を実行できます。 詳細については、 一括操作 に関するガイドを参照してください。

このガイドで言及されている概念の詳細については、サーバー マニュアルの次のページを参照してください。

ACID compliance の詳細については、 「 データベース管理システムの ACID プロパティとは 」を参照してください。 MongoDB Webサイトの記事。

挿入操作の詳細については、ドキュメントの挿入ガイドを参照してください。

このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。