トランザクションのコミットおよびロールバック
常時、アプリケーション処理は単一トランザクションから構成される場合があります。 ただし、アプリケーション処理全体には、コミットまたはロールバック操作の結果、多くのトランザクションが関係する可能性があります。
データの読み取りまたは書き込みが行われると、トランザクションが開始します。 COMMIT または ROLLBACK ステートメントを実行する時点、またはアプリケーション処理の終了時点でトランザクションが終了します。
- COMMIT ステートメントは、現行トランザクション中に行われたデータベースの変更をコミットし、変更を永続的なものにします。
Db2 使用中の分離レベルとロックの原因に応じて、アプリケーションプロセスに代わって取得したロックを保持または解放します。
- ROLLBACK ステートメントは、現行トランザクション中に行われたデータベース変更をバックアウト (取り消し) し、変更されたデータを、トランザクション開始前の状態に戻します。
トランザクションの開始と終了により、アプリケーション処理における整合点 が定義されます。 整合点とは、アプリケーション・プログラムがアクセスするすべてのリカバリー可能データに、他のデータとの整合性がある時点です。 次の図に、この概念を示します。
ロールバック操作が成功すると、 Db2 は未コミットの変更を元に戻し、作業単位が開始された時点でのデータの一貫性を復元します。 つまり、 Db2 は次の図のように作業を元に戻します。 トランザクションが失敗すると、ロールバック操作が開始されます。
トランザクションを取り消すもう 1 つの方法として、変更をセーブポイントまでロールバックする方法があります。 セーブポイント とは、トランザクションにおける特定のポイント・イン・タイムでのデータの状態を表わす名前付きエンティティーです。 トランザクションを終了せずに、トランザクション内のセーブポイントまで変更をバックアウトするだけの場合は、ROLLBACK ステートメントを使用できます。
セーブポイントがサポートされているため、トランザクション内での SQL ステートメントの集合の扱いを制御するアプリケーション・ロジックのコーディングが容易になります。 アプリケーションは、トランザクション内にセーブポイントを設定できます。 アプリケーション・ロジックは、トランザクションの全体的な結果に影響を与えることなく、アプリケーションによりセーブポイントが設定された時点以降に行われたデータの変更を取り消すことができます。 セーブポイントを使用すると、不測の事態対応と what-if ロジックをアプリケーションに組み込む必要がないため、アプリケーションのコーディングの効率が向上します。
これまでの説明で、コミット処理とロールバック処理の仕組みと、プログラムで頻繁にコミットを実行する必要性が明らかになりました。