Overview
このガイドでは、MongoDB Go Driver を使ってトランザクションを実行する方法を説明します。トランザクションを使用すると、トランザクションがコミットされるまでデータを変更しない一連の操作を実行できます。トランザクション内のいずれかの操作でエラーが返された場合、ドライバーはトランザクションをキャンセルし、変更が反映される前にすべてのデータ変更を破棄します。
MongoDB では、トランザクションは論理セッション内で実行されます。セッションは、順番に実行されるよう関連付けられた読み取り操作または書き込み操作のグループです。セッションにより、一連の操作に対する因果整合性が有効になる、または ACID transaction 内で操作を実行できるようになります。MongoDBは、トランザクション操作で予期せぬエラーが発生した場合でも、その操作に関わるデータの一貫性が保たれることを保証します。
Go ドライバーを使用する場合、Client インスタンスから Session 型の新しいセッションを作成できます。毎回新しいクライアントをインスタンス化するのではなく、複数のセッションで同じクライアントとトランザクションを使用することを推奨します。
警告
Session は、それを作成した Client(または関連付けられたDatabase または Collection)でのみ使用します。Session と、異なる Client を使用すると、操作エラーが発生します。
警告
Session の実装は、複数の goroutine による同時使用では安全ではありません。
メソッド
StartSession() メソッドを使用してセッションを開始した後、 Session インターフェースによって提供されるメソッド セットを使用してセッション状態を変更できます。次の表では、これらの方法について説明します。
方式 | 説明 |
|---|---|
| このセッションで、指定されたオプションで構成された新しいトランザクションを開始します。セッションで既にトランザクションが実行中の場合はエラーを返します。このメソッドの詳細については、サーバー マニュアルの「startTransaction() ページ」を参照してください。 |
| このセッションのアクティブなトランザクションを終了します。セッションにアクティブなトランザクションがない場合、またはトランザクションがコミットされたか、または終了した場合はエラーを返します。このメソッドの詳細については、サーバー マニュアルの abortTransaction() ページを参照してください。 |
| このセッションのアクティブなトランザクションをコミットします。セッションにアクティブなトランザクションがない場合、またはトランザクションが終了した場合はエラーを返します。このメソッドの詳細については、サーバー マニュアルの commitTransaction() ページを参照してください。
|
| このセッションでトランザクションを開始し、 |
| 既存のトランザクションを終了し、セッションを閉じます。 |
Sessionインターフェースには、セッション プロパティを取得し、可変セッション プロパティを変更するメソッドもあります。 詳しくは、 API ドキュメント を参照してください。
注意
並列操作はサポートされていません
Go ドライバーは、1 つのトランザクション内で並列操作を実行することをサポートしていません。
例
次の例は、以下の手順でセッションを作成し、トランザクションを作成し、複数のドキュメント挿入操作をコミットする方法を示しています。
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 ドキュメントを参照してください。