Overview
このガイドでは、Rust ドライバーを使用してトランザクションを実行する方法を学習できます。 トランザクションを使用すると、トランザクション全体がコミットされた場合にのみ、データを変更する一連の操作を実行できます。 トランザクション内のいずれかの操作が成功しない場合、ドライバーはトランザクションを停止し、変更が反映される前にすべてのデータ変更を破棄します。 この特徴はアトミック性と 呼ばれます。
MongoDB では、トランザクションは論理セッション内で実行されます。 セッションは 、順番に実行されるよう関連付けられた読み取り操作または書き込み操作のグループです。 セッションにより、一連の操作に対する 因果整合性 が有効になり、 ACID 準拠のトランザクション(アトミック性、整合性、分離、耐久性の期待を満たすトランザクション)内で操作を実行できるようになります。 MongoDBは、トランザクション操作で予期せぬエラーが発生した場合でも、その操作に関わるデータの一貫性が保たれることを保証します。
Rust ドライバーを使用すると、 ClientインスタンスからClientSession型の新しいセッションを作成できます。 毎回新しいクライアントをインスタンス化するのではなく、クライアントを複数のセッションやトランザクションで再利用することで、アプリのパフォーマンスを向上させることができます。
警告
ClientSessionは、それを作成したClientで実行されている操作でのみ使用します。 ClientSessionと別のClientを使用すると、操作エラーが発生します。
メソッド
Clientインスタンスでstart_session()メソッドを使用してClientSessionを作成します。 その後、 ClientSessionタイプが提供するメソッドを使用してセッション状態を変更できます。 次の表では、これらの方法について説明します。
方式 | 説明 |
|---|---|
| このセッションで新しいトランザクションを開始します。セッションはトランザクション内の各操作に渡される必要があります。そうしない場合、操作はトランザクションの外で実行されます。 |
| このセッションのアクティブなトランザクションをコミットします。セッションにアクティブなトランザクションがない場合、またはトランザクションが以前に終了している場合、このメソッドはエラーを返します。 |
| このセッションのアクティブなトランザクションを終了します。 このメソッドは、セッションにアクティブなトランザクションがない場合、またはトランザクションがコミットされたか、または終了した場合は、エラーを返します。 |
| 指定されたコールバックを実行し、トランザクションをコミットまたは終了します。ドライバーは、 |
重要
トランザクションで実行できるメソッド
トランザクション内で 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(()) }
次のコードは、トランザクションを実行するために次のアクションを完了します。
start_session()メソッドを使用してクライアントからセッションを作成します。トランザクションを開始するには、
start_transaction()メソッドを呼び出します。トランザクション内で
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 ドキュメント
このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。