トランザクション
Overview
このガイドでは、 Kotlin ドライバーを使用してトランザクションを実行する方法を学習できます。 トランザクションを使用すると、トランザクションがコミットされるまでデータを変更しない一連の操作を実行できます。 トランザクション内のいずれかの操作でエラーが返された場合、ドライバーはトランザクションをキャンセルし、変更が反映される前にすべてのデータ変更を破棄します。
MongoDB では、トランザクションは論理セッション内で実行されます。セッションは、順番に実行されるよう関連付けられた読み取り操作または書き込み操作のグループです。セッションにより、一連の操作に対する因果整合性が有効になる、または ACID transaction 内で操作を実行できるようになります。MongoDBは、トランザクション操作で予期せぬエラーが発生した場合でも、その操作に関わるデータの一貫性が保たれることを保証します。
Kotlin ドライバーを使用すると、 MongoClient
インスタンスからClientSession
として新しいセッションを作成できます。 毎回新しいクライアントをインスタンス化するのではなく、クライアントを複数のセッションやトランザクションで再利用することを推奨します。
警告
ClientSession
は、それを作成した MongoClient
(または関連付けられたMongoDatabase
または MongoCollection
)でのみ使用します。ClientSession
と、異なる MongoClient
を使用すると、操作エラーが発生します。
メソッド
Client
インスタンスでstartSession()
メソッドを使用してClientSession
を作成します。 その後、次の方法を使用してセッション状態を変更できます。
方式 | 説明 |
---|---|
startTransaction() | Starts a new transaction for this session with the
default transaction options. You cannot start a
transaction if there's already an active transaction
on the session. To set transaction options, use startTransaction(transactionOptions: TransactionOptions) . |
abortTransaction() | 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. |
commitTransaction() | 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. |
ClientSession
には、セッション プロパティを取得し、可変セッション プロパティを変更するメソッドもあります。これらのメソッドの詳細については、 APIドキュメント を表示します。
例
この例では、次の Kotlin データ クラスを使用してドキュメントをモデル化します。
data class Account( val accountId: String, val amount: Int )
次の例は、セッションを作成し、トランザクションを作成し、既存のドキュメントに変更をコミットする方法を示しています。
startSession()
メソッドを使用してクライアントからセッションを作成します。トランザクションを開始するには、
startTransaction()
メソッドを使用します。指定されたドキュメントを更新し、すべての操作が成功した場合は
commitTransaction()
メソッドを使用するか、いずれかの操作が失敗した場合はabortTransaction()
を使用します。
// Set up the session val session = client.startSession() try { session.startTransaction() val savingsColl = database .getCollection<Account>("savings_accounts") val checkingColl = database .getCollection<Account>("checking_accounts") savingsColl.findOneAndUpdate( session, eq(Account::accountId.name, "9876"), inc(Account::amount.name, -100), ) checkingColl.findOneAndUpdate( session, eq(Account::accountId.name, "9876"), inc(Account::amount.name, 100) ) // Commit the transaction val result = session.commitTransaction() println("Transaction committed.") } catch (error: Exception) { println("An error occurred during the transaction: ${error.message}") // Abort the transaction session.abortTransaction() }
詳細情報
このガイドで言及されている概念の詳細については、サーバー マニュアルの次のページを参照してください。
ACID compliance の詳細については、 「 データベース管理システムの ACID プロパティとは 」を参照してください。 MongoDB Webサイトの記事。
API ドキュメント
このガイドで説明した型やメソッドの詳細については、次の API ドキュメントを参照してください。