トランザクション
Overview
このガイドでは、MongoDB Go Driver を使ってトランザクションを実行する方法を説明します。トランザクションを使用すると、トランザクションがコミットされるまでデータを変更しない一連の操作を実行できます。トランザクション内のいずれかの操作でエラーが返された場合、ドライバーはトランザクションをキャンセルし、変更が反映される前にすべてのデータ変更を破棄します。
MongoDB では、トランザクションは論理セッション内で実行されます。セッションは、順番に実行されるよう関連付けられた読み取り操作または書き込み操作のグループです。セッションにより、一連の操作に対する因果整合性が有効になる、または ACID transaction 内で操作を実行できるようになります。MongoDBは、トランザクション操作で予期せぬエラーが発生した場合でも、その操作に関わるデータの一貫性が保たれることを保証します。
Go ドライバーを使用すると、Client
インスタンスから Session
型の新しいセッションを作成できます。毎回新しいクライアントをインスタンス化するのではなく、クライアントを複数のセッションやトランザクションで再利用することを推奨します。
警告
Session
は、それを作成した Client
(または関連付けられたDatabase
または Collection
)でのみ使用します。Session
と、異なる Client
を使用すると、操作エラーが発生します。
警告
Session
の実装は、複数の goroutine による同時使用では安全ではありません。
メソッド
StartSession()
メソッドを使用してセッションを開始した後、 Session
インターフェースによって提供されるメソッド セットを使用してセッション状態を変更できます。次の表では、これらの方法について説明します。
方式 | 説明 |
---|---|
StartTransaction() | Starts a new transaction, configured with the given options, on
this session. Returns an error if there is already
a transaction in progress for the session. To learn more about
this method, see the startTransaction() page in the Server manual. Parameter: TransactionOptions Return Type: error |
AbortTransaction() | Ends the active transaction for this session. Returns an
error if there is no active transaction for the session or the
transaction has been committed or ended. To learn more about
this method, see the abortTransaction() page in the Server manual. Parameter: Context Return Type: error |
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. To learn more about
this method, see the commitTransaction() page in the Server manual. The CommitTransaction() method is an idempotent function, which
means that you can attempt to commit a transaction multiple times without changing data after the first successful commit.
A transaction can succeed but return an error with the
UnknownTransactionCommitResult label. If you rerun the
CommitTransaction() method after receiving this error,
your data is not changed by the repeat attempts.Parameter: Context Return Type: error |
WithTransaction() | Starts a transaction on this session and runs the fn
callback.Parameters: Context , fn func(ctx SessionContext) , TransactionOptions Return Type: interface{} , error |
EndSession() | Ends any existing transactions and closes the session. Parameter: Context Return Type: none |
Session
インターフェースには、セッション プロパティを取得し、可変セッション プロパティを変更するメソッドもあります。 詳しくは、 API ドキュメント を参照してください。
例
次の例は、以下の手順でセッションを作成し、トランザクションを作成し、複数のドキュメント挿入操作をコミットする方法を示しています。
StartSession()
メソッドを使用してクライアントからセッションを作成します。トランザクションを開始するには、
WithTransaction()
メソッドを使用します。複数のドキュメントを挿入します。
WithTransaction()
メソッドは挿入を実行し、トランザクションをコミットします。いずれかの操作でエラーが発生した場合、WithTransaction()
がトランザクションのキャンセルを取り扱います。EndSession()
メソッドを使用してトランザクションとセッションを閉じます。
wc := writeconcern.Majority() txnOptions := options.Transaction().SetWriteConcern(wc) // Starts a session on the client session, err := client.StartSession() if err != nil { panic(err) } // Defers ending the session after the transaction is committed or ended defer session.EndSession(context.TODO()) // Inserts multiple documents into a collection within a transaction, // then commits or ends the transaction result, err := session.WithTransaction(context.TODO(), func(ctx mongo.SessionContext) (interface{}, error) { result, err := coll.InsertMany(ctx, []interface{}{ bson.D{{"title", "The Bluest Eye"}, {"author", "Toni Morrison"}}, bson.D{{"title", "Sula"}, {"author", "Toni Morrison"}}, bson.D{{"title", "Song of Solomon"}, {"author", "Toni Morrison"}}, }) return result, err }, txnOptions)
トランザクションをさらに制御する必要がある場合は、完全なサンプルコードを使った、トランザクションの手動作成、コミット、および終了方法を示す例を参照してください。
詳細情報
挿入操作の詳細については、 「ドキュメントの挿入」基本ページを参照してください。
Go ドライバーで書込み保証 (write concern) を指定する方法の詳細については、「書込み保証 (write concern)」を参照してください。
Go Driver でセッションとトランザクションを使用する追加の例については、マルチドキュメント ACID トランザクションに関する開発者ブログ記事を参照してください。
API ドキュメント
このガイドで説明した型やメソッドの詳細については、次の API ドキュメントを参照してください。