SQL 解説書

アプリケーションのプロセス、並行性、および回復

すべての SQL プログラムは、 アプリケーション・プロセス またはエージェントの一部として実行されます。

アプリケーション・プロセスには、1 つ以上のプログラムの実行が関係しており、 データベース・マネージャーが資源を割り当てたりロックしたりする場合の単位となります。 異なるいくつかのプログラムの実行、または同じプログラムの複数の異なる実行には、 異なる複数のアプリケーション・プロセスが関係しています。

同時に複数のアプリケーション・プロセスが同じデータへのアクセスを要求することがあります。

このような状況でデータ保全性を維持するためのメカニズムとしてロック があります。 これは、たとえば 2 つのアプリケーション・プロセスが同時にデータの同じ行を更新するのを防ぐ、 などの処理を行います。

データベース・マネージャーは、 あるアプリケーション・プログラムが行った変更でまだコミットされていないものが、 誤って他に認識されることのないよう、ロックを獲得します。 プロセスが終了すると、データベース・マネージャーは、 アプリケーション・プロセスのためにデータベース・マネージャーが獲得し保持していたロックをすべて解放します。 もっと早い時期にロックを解放するには、 アプリケーション・プロセス自体で明示的に要求する必要があります。 この操作はコミット と呼ばれ、 これにより作業単位中に獲得していたロックが解放され、 作業単位中に加えられた変更がデータベースにコミットされます。

データベース・マネージャーには、アプリケーション・プロセスが行った変更で、 まだコミットされていないものを取り消す 手段が用意されています。 これは、アプリケーション・プロセスの一部に障害が発生したとき、 またはデッドロック やロック・タイムアウト状態などで必要になります。 ただし、アプリケーション・プロセス自体でも、 自分の行ったデータベースへの変更を取り消すように明示的に要求することができます。 この操作はロールバック と呼ばれます。

作業単位 とは、アプリケーション・プロセス内の、 回復可能な一連の操作のことです。 作業単位は、アプリケーション・プロセスの開始時に開始されます。 3 また、アプリケーションの終了以外の何らかの理由によって直前の作業単位が終了したときにも、 作業単位が開始します。 作業単位は、コミット操作、ロールバック操作、 またはアプリケーション・プロセスの終了によって終了します。 コミットまたはロールバック操作は、 それによって終了する作業単位の中で行われたデータベースへの変更内容にしか影響しません。

このような変更がコミットされないまま残っている間は、 他のアプリケーション・プロセスはそれらの変更を認識することはできません。 コミットせずに変更をバックアウトすることも可能です。 4 データベースの変更内容がコミットされると、 他のアプリケーション・プロセスからその変更内容にアクセスできるようになり、 ロールバックによってバックアウトすることはできなくなります。

データベース・マネージャーがアプリケーション・プロセスのために獲得したロックは、 作業単位が終了するまで保持されます。 この規則の例外は、カーソル固定分離レベル (この場合は、 カーソルが行から行へ移動するときにロックが解放されます) と、 非コミット読み取りレベル (この場合は、ロックは獲得されません) です (分離レベル を参照)。

作業単位の開始と終了によって、 アプリケーション・プロセス内の一貫性ポイントが定義されます。 たとえば、銀行業務のトランザクションで、 ある口座から別の口座へ資金を移動することがあるかもしれません。

図 1. コミット・ステートメントの作業単位


REQTEXT

このようなトランザクションでは、まずその資金を初めの口座から減算してから、 第 2 の口座にそれを加算する、という処理が必要です。

図 2. ロールバック・ステートメントの作業単位


REQTEXT

減算のステップの直後の段階では、データに矛盾が生じています。 資金が第 2 の口座に加算して初めて、一貫性が取り戻されるわけです。 両方のステップが完了したときに、コミット操作を実行して作業単位を終了させるなら、 他のアプリケーション・プロセスが変更内容を利用できるようになります。

1 つの作業単位が終わる前に障害が発生すると、 データベース・マネージャーはコミットされていない変更内容をロールバックし、 その作業単位の開始時点でのデータ一貫性を復元します。
注:アプリケーション・プロセスが 自分自身のロックのために操作できなくなるということは決してありません。 5


脚注:

3
DB2 CLI および組み込み SQL は、 並行トランザクション と呼ばれる接続モードをサポートします。 これは、それぞれが独立したトランザクションである複数の接続をサポートします。 1 つのアプリケーションが同じデータベースに対して複数の接続を並行して行うことができます。 複数のスレッドによるデータベース・アクセスの詳細については、 アプリケーション開発の手引き を参照してください。

4
非コミット読み取り (UR)で説明されている未非コミット読み取りの分離レベルの場合を除きます。

5
アプリケーションが並行してトランザクションを使用している場合、 一方のトランザクションによるロックのために、 他方のトランザクションの運用が影響を受ける可能性があります。 詳細については、アプリケーション開発の手引き を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]