Docs Menu
Docs Home
/ / /
Rust ドライバー
/

トランザクション

項目一覧

  • Overview
  • メソッド
  • 詳細情報
  • API ドキュメント

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

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

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

警告

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

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

方式
説明
start_transaction()
Starts a new transaction on this session. The session must be passed into each operation within the transaction, or the operation will run outside of the transaction.

You can set transaction options by chaining TransactionOptions option builder methods to start_transaction().

Errors returned from operations run within the transaction might include a TRANSIENT_TRANSACTION_ERROR label, which indicates that the entire transaction can be ended, then retried with the expectation that it will succeed.
commit_transaction()
Commits the active transaction for this session. This method returns an error if there is no active transaction for the session or the transaction was previously ended.

This method might return an error that includes an UNKNOWN_TRANSACTION_COMMIT_RESULT label, which indicates that it is unknown if the committed transaction satisfies the set write concern. If you encounter this error, it is safe to retry the commit until the write concern is satisfied or the method returns an error without the label.
abort_transaction()
Ends the active transaction for this session. This method returns an error if there is no active transaction for the session or if the transaction was committed or ended.
and_run()
Runs the given callback, then commits or ends the transaction. The driver retries callbacks and commits that raise an error with a TRANSIENT_TRANSACTION_ERROR label. If they raise any other error, the driver ends the transaction and returns the error to the caller. When you use this method to perform a transaction, the driver automatically handles any errors, so you can choose to omit error handling code.

Because the callback returns a future and can be run multiple times, the Rust language closure borrowing rules for captured values can be restrictive. So, the and_run() method accepts a context parameter that is passed to the callback.

Parameters: context C, callback 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ドキュメント を参照してください。

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

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

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

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

戻る

Atlas Search インデックス