アプリケーションプロセス、トランザクション、同時実行性、およびリカバリ
すべてのSQLプログラムは、1つまたは複数のプログラムの実行を含むアプリケーションプロセスの一部として実行されます。 アプリケーション処理によって、実行するプログラムが異なることや、同じプログラムを異なる時点で実行することがあります。 アプリケーションが Db2 データベースと対話する場合、トランザクションが開始されます。
Db2 データには、ユーザー作成のアプリケーション、ユーザーが動的に入力するSQLステートメント、さらにはユーティリティなど、さまざまな種類のプログラムがアクセスします。 Db2 データへのあらゆる種類のアクセスを説明する単語は、 アプリケーションプロセスと呼ばれます。 すべての SQL プログラムは、アプリケーション処理の一部として実行されます。
トランザクション とは、アプリケーションとデータベース間で行われる一連のアクションで す。この一連のアクションは、データベースのデータの読み取り/書き込み実行時に開始します。 トランザクションは作業単位 とも呼ばれます。
例えば、銀行口座で資金にアクセスするとどうなるかを検討します。 銀行取引 (トランザクション) では、2 つの口座間で資金の移動が行われることがあります。 トランザクションにおいて、アプリケーション・プログラムは最初に 1 番目の口座から資金を減算してから、2 番目の口座にその資金を加算します。 減算のステップの直後の段階では、データに不整合があります。 資金が 2 番目の口座に加算された後で、再び整合性のある状態になります。
データの整合性を確保するために、 Db2 はコミット操作、ロールバック操作、ロックなど、さまざまな技術を使用しています。
この銀行取引 (トランザクション) の減算と加算のステップが完了した時点で、アプリケーションはコミット操作を使用してトランザクションを終了できます。これにより、他のアプリケーション処理がその変更データを使用できるようになります。 コミット 操作により、データベースの変更が永続的なものとなります。
同時に複数のアプリケーション処理要求が同じデータにアクセスすると、何が起こるでしょうか。 あるいは、特定の状況では、ユーティリティーと並行して SQL ステートメントが同じ表スペースに対して実行されることもあります。 Db2 このような状況下でデータの整合性を維持するためにロックを使用し、例えば、2つのアプリケーションプロセスが同時に同じ行のデータを更新してしまうことを防ぎます。
Db2 ロックを取得することで、あるアプリケーションプロセスによって行われた未コミットの変更が他のプロセスによって認識されるのを防ぎます。 Db2 アプリケーションプロセスが終了すると、そのプロセスに代わって取得したロックを自動的にすべて解除しますが、アプリケーションプロセスはロックをより早く解除するように明示的に要求することもできます。 コミット操作により、アプリケーション処理が獲得したロックが解放され、この処理で行われたデータベース変更がコミットされます。
Db2 また、アプリケーションプロセスがコミットしていない変更を元に戻す方法も提供しています。 アプリケーション処理側での障害発生時、またはデッドロック 状態の発生時に、バックアウトが必要となることがあります。 デッドロックは、表などのリソースの使用を巡る競合が解決できない場合に発生します。 ただし、アプリケーション・プロセスで、そのデータベースの変更をバックアウトするように明示的に要求することもできます。 この操作をロールバック と呼びます。 SQL プログラムがこれらのコミット操作とロールバック操作を指定するときに使用するインターフェースは、環境によって異なります。 例えば JDBC 環境では、アプリケーションはコミット・メソッドとロールバック・メソッドを使用してトランザクションをコミットまたはロールバックします。