トランザクション (ODBC)
このトピックの内容は、MFC ODBC クラスに該当します。
トランザクションとは、データ ソースに対する一連の更新をグループ化すなわちバッチ処理する方法です。これにより、すべてが一度にコミットされます。または、トランザクションをロールバックした場合には、すべてがコミットされません。 トランザクションを使用しないと、データ ソースに対する変更は、要求時にコミットされるのではなく、自動的にコミットされます。
Note
すべての ODBC データベース ドライバーでトランザクションがサポートされるわけではありません。 CDatabase または CRecordset オブジェクトの CanTransact
メンバー関数を呼び出して、ドライバーによって所定のデータベースに対するトランザクションがサポートされるかどうかを確認します。 データ ソースが完全なトランザクションをサポートしているかどうかを CanTransact
が通知するわけではないことに注意してください。 開いている CRecordset
オブジェクトに対するトランザクションの影響を調べるには、CommitTrans
と Rollback
の後で CDatabase::GetCursorCommitBehavior
および CDatabase::GetCursorRollbackBehavior
も呼び出す必要があります。
CRecordset
オブジェクトに対する AddNew
および Edit
メンバー関数の呼び出しは、Update
を呼び出すとすぐにデータ ソースに影響します。 Delete
呼び出しもすぐに有効になります。 一方で、AddNew
、Edit
、Update
、および Delete
への複数の呼び出しで構成されるトランザクションを使用できます。これらは実行されますが、CommitTrans
を明示的に呼び出すまではコミットされません。 トランザクションを確立することによって、そのような一連の呼び出しを実行できると同時に、ロールバックの機能も維持できます。 重要なリソースが使用できない場合、または他の条件のためにトランザクション全体を完了できない場合は、トランザクションをコミットする代わりにロールバックできます。 この場合、トランザクションに含まれる変更がデータ ソースに影響を与えることはありません。
Note
現時点では、バルク行フェッチを実装した場合でも、クラス CRecordset
によってデータ ソースへの更新はサポートされません。 つまり、AddNew
、Edit
、Delete
、または Update
への呼び出しを行うことはできません。 ただし、更新を実行するために独自の関数を記述した後で、特定のトランザクション内でそれらの関数を呼び出すことはできます。 バルク行フェッチの詳細については、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
Note
レコードセットに影響する以外に、トランザクションは、ユーザーが直接実行する SQL ステートメントに影響します (CDatabase
オブジェクトに関連付けられた ODBC HDBC またはその HDBC に基づいた ODBC HSTMT を使用する場合)。
トランザクションは、複数のレコードを同時に更新する必要がある場合に特に便利です。 このケースでは、最後の更新が行われる前に例外がスローされた場合に発生する可能性のある、中途半端に完了したトランザクションを回避する必要があります。 このような更新をトランザクションにグループ化すると、変更の復旧 (ロールバック) が可能になり、レコードをトランザクション前の状態に戻すことができます。 たとえば、銀行が口座 A から口座 B にお金を振り替える場合、資金を正しく処理するために A からの引き出しと B への預け入れがどちらも成功する必要があります。そうでない場合はトランザクション全体を失敗とする必要があります。
データベース クラスでは、CDatabase
オブジェクトを使用してトランザクションを実行します。 CDatabase
オブジェクトは、データ ソースへの接続を表します。その CDatabase
オブジェクトに関連付けられた 1 つ以上のレコードセットが、レコードセット メンバー関数を使用してデータベースのテーブルを操作します。
Note
サポートされているトランザクションのレベルは 1 つだけです。 トランザクションを入れ子にすることはできません。また、1 つのトランザクションが複数のデータベース オブジェクトにまたがることもできません。
次のトピックでは、トランザクションの実行方法の詳細について説明します。