トランザクション
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. For more
information, see the manual entry. Parameter: TransactionOptions Return Type: error |
AbortTransaction() | Aborts 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 aborted. For more
information, see the manual entry. 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 the
transaction has been aborted. For more
information, see the manual entry. 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() | Aborts any existing transactions and closes the session. Parameter: Context Return Type: none |
Session
インターフェースには、セッション プロパティを取得し、可変セッション プロパティを変更するメソッドもあります。 詳しくは、 API ドキュメント を参照してください。
例
次の例は、以下の手順でセッションを作成し、トランザクションを作成し、複数のドキュメント挿入操作をコミットする方法を示しています。
StartSession()
メソッドを使用してクライアントからセッションを作成します。トランザクションを開始するには、
WithTransaction()
メソッドを使用します。複数のドキュメントを挿入します。
WithTransaction()
メソッドは挿入を実行し、トランザクションをコミットします。 いずれかの操作でエラーが発生した場合、WithTransaction()
がトランザクションの中止を取り扱います。EndSession()
メソッドを使用してトランザクションとセッションを閉じます。
wc := writeconcern.New(writeconcern.WMajority()) txnOptions := options.Transaction().SetWriteConcern(wc) session, err := client.StartSession() if err != nil { panic(err) } defer session.EndSession(context.TODO()) 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)
トランザクションをさらに制御する必要がある場合は、 完全なサンプルコード を使った、トランザクションの手動作成、コミット、および中止方法を示す例を参照してください。
詳細情報
挿入操作の詳細については、「ドキュメントの挿入」基本ページを参照してください。
書込み保証 (write concern) の詳細については、「 CRUD 操作の実行変更 」の基礎ページを参照してください。
Go Driver でセッションとトランザクションを使用する追加の例については、 マルチドキュメント ACID トランザクション に関する開発者ブログ記事を参照してください。
API ドキュメント
このガイドで説明した型やメソッドの詳細については、次の API ドキュメントを参照してください。