DB2 Version 9.7 for Linux, UNIX, and Windows

分離レベル

アプリケーション・プロセスに関連付けられた分離レベル は、 そのプロセスによりアクセスされているデータのロックの度合い、または並行して実行されている他のプロセスからそのデータを分離する度合いを決定します。 分離レベルは、作業単位の持続期間内で有効です。

したがって、アプリケーション・プロセスの分離レベルは、以下を指定します。

静的 SQL ステートメントの分離レベルは、パッケージの属性として指定され、 そのパッケージを使用するアプリケーション・プロセスに適用されます。 分離レベルは、ISOLATION バインドまたはプリコンパイル・オプションを設定することにより、プログラム準備処理中に指定されます。 動的 SQL ステートメントの場合、デフォルトの分離レベルは、ステートメントを作成するパッケージに指定された分離レベルです。 SET CURRENT ISOLATION ステートメントを使用すると、セッション内で発行される動的 SQL ステートメントに対して別の分離レベルを指定できます。 詳しくは、『CURRENT ISOLATION 特殊レジスター』を参照してください。 静的 SQL ステートメントと動的 SQL ステートメントのどちらの場合でも、select-statement 内の isolation-clause は、特殊レジスター (設定されている場合) と BIND オプションの両方の値をオーバーライドします。 詳しくは、『Select-statement』を参照してください。

分離レベルはロックにより施行され、並行アプリケーション・プロセスによるデータ・アクセスは、 使用されるロックのタイプに応じて制限または禁止されます。 宣言済み一時表とその行は、宣言したアプリケーションしかアクセスできないので、ロックされることはありません。

データベース・マネージャーでは、大きく分けて次の 3 つのロック・カテゴリーがサポートされています。
共有 (S)
S ロックでは、並行アプリケーション・プロセスの操作は、データへの読み取り専用操作に限定されます。
更新 (U)
U ロックでは、並行アプリケーション・プロセスの操作は、行の更新を宣言したのではない限り、データへの読み取り専用操作に限定されます。 データベース・マネージャーは、行を現在見ているプロセスがそれを更新する可能性があると想定します。
排他 (X)
X ロックでは、同時アプリケーション・プロセスがどのような形であれ、そのデータにアクセスできないようにします。 これは、読み取りはできてもデータの変更はできない非コミット読み取り (UR) の分離レベルのアプリケーション・プロセスには当てはまりません。
分離レベルとは関係なく、データベース・マネージャーは、 挿入、更新、または削除の対象となる行のすべてに排他ロックをかけます。 このため、どの分離レベルでも、アプリケーション・プロセスが 1 作業単位の間に変更する行は、 その作業単位が完了するまで他のアプリケーション・プロセスにより変更されることは決してありません。
データベース・マネージャーは 4 つの分離レベルをサポートします。
注: 一部のホスト・データベース・サーバーはコミットなし (NC) 分離レベルをサポートします。 その他のデータベース・サーバーでは、この分離レベルは非コミット読み取り分離レベルに似た動作をします。
注: DB2 製品の 4 つのどの分離レベルでも、更新の消失 (LU) の並行性問題は許容されません。

これ以降では、それぞれの分離レベルの詳細について、パフォーマンスへの影響の大きい順に説明されています。ただし、データにアクセスしたりデータを更新したりする場合には、後で説明されているものほど注意が必要になります。

反復可能読み取り (RR)

反復可能読み取り 分離レベルでは、1 つの作業単位 (UOW) の間にアプリケーションが参照する行がすべてロックされます。 アプリケーションが同じ作業単位の中で 2 回 SELECT ステートメントを発行した場合には、いずれの場合も同じ結果が返されます。 RR では、更新の消失の可能性はなく、コミットされていないデータへのアクセス、反復不能読み取り、および幻像読み取りは行えません。

RR では、アプリケーションは、UOW が完了するまでに、必要な回数だけ行の取得および操作を行えます。 しかしそれ以外のアプリケーションは、その UOW が完了するまで、結果セットに影響を与える行を更新、削除、または挿入することができません。 RR 分離レベルの下で実行されるアプリケーションは、コミットされていない他のアプリケーションによる変更は認識できません。 この分離レベルでは、戻されるデータすべてをアプリケーションが認識するまでは、一時表や行ブロッキングが使用されている場合であっても、それらのデータはすべて未変更のままになります。

取得される行だけでなく、参照されるすべての行がロックされます。 例えば、10 000 個の行をスキャンしてそれらに述部を適用する場合、たとえ 10 行しか適格でなくても、それら 10 000 個の行すべてにロックがかけられます。 照会が再度実行された場合には、照会によって参照される行のリストに加えられることになる行については、別のアプリケーションが挿入または更新を行うことができません。 これにより、幻像読み取りを防ぎます。

RR は多数のロックを獲得できるため、この数が locklist および maxlocks データベース構成パラメーターで指定した限度を超える可能性があります。 ロック・エスカレーションが発生する可能性がある場合、ロック・エスカレーションを避けるために、 オプティマイザーは索引のスキャンのために単一表レベル・ロックを獲得することがあります。 表レベルのロックをかけたくない場合は、読み取り固定分離レベルを使用します。

参照制約を評価する際、ユーザーが以前に設定した分離レベルに関係なく、外部表のスキャン時に使用される分離レベルが DB2® サーバーによって RR にアップグレードされることがあります。 これが起こるとさらに多くのロックがコミットの時まで保持されるため、デッドロックやロックのタイムアウトが発生する可能性が高くなります。 これらの問題を避けるには、外部キー列のみが含まれる索引を作成し、参照整合性スキャンでそれを代わりに使用できるようにします。

読み取り固定 (RS)

読み取り固定 分離レベルでは、 ある作業単位の間にアプリケーションが取得する行のみにロックをかけます。 RS により、ある UOW で適格とされて読み取られた行は、 その UOW が完了するまで他のアプリケーション・プロセスによって変更できなくなり、 また別のアプリケーション・プロセスによって変更されたすべての行は、 そのプロセスによって変更がコミットされるまで読み取れなくなります。 RS では、コミットされていないデータへのアクセスおよび反復不能読み取りは行えません。 ただし、幻像読み取りは行えます。

この分離レベルでは、戻されるデータすべてをアプリケーションが認識するまでは、一時表や行ブロッキングが使用されている場合であっても、それらのデータはすべて未変更のままになります。

RS 分離レベルでは、高度の並行性が提供されると共に、データの表示が一定になります。 この目的を達成するため、オプティマイザーは、ロック・エスカレーションが発生するまで表レベル・ロックがかけられないようにします。

RS 分離レベルは以下の条件下で作動するアプリケーションに適しています。
  • 並行環境で作動する
  • 作業単位の間、適格となる行を一定にしておく必要がある
  • 1 つの作業単位の間に同じ照会を 2 回以上発行しない、 または 1 つの作業単位の間に同じ照会を 2 回以上発行したときに同じ結果セットを得る必要がない

カーソル固定 (CS)

カーソル固定 分離レベルは、トランザクションの際にアクセスする行にカーソルを置いたまま、その行をロックします。 このロックは、次の行が取り出されるか、またはトランザクションが終了する時まで有効です。 しかし、行の中の何らかのデータが変更された場合、変更がコミットされるまでロックは保持されます。

この分離レベルでは、更新可能なカーソルがある行に置かれている間、他のアプリケーションはその行を更新したり削除したりできません。 CS では、他のアプリケーションの非コミット・データにアクセスすることはできません。 ただし、反復不能読み取りおよび幻像読み取りは行えます。

CS はデフォルトの分離レベルです。 コミットされたデータだけを認識する必要があり、並行性を最大にする場合にこれは適しています。

注: バージョン 9.7 で導入されたcurrently committed セマンティクスでは、 今までのようにコミットされたデータのみが返されますが、読み取り側は更新側が行ロックを解除するまで待機しなくなりました。 代わりに読み取り側は、現在コミット済みのバージョンに基づくデータ、つまり書き込み操作の開始前のデータを返します。

非コミット読み取り (UR)

非コミット読み取り 分離レベルでは、アプリケーションが他のトランザクションの非コミットの変更にアクセスできます。 さらに UR の場合、別のアプリケーションが表を変更またはドロップしようとするのでない限り、読み取り中の行に別のアプリケーションがアクセスすることが可能です。

UR では、コミットされていないデータへのアクセス、反復不能読み取り、および幻像読み取りが可能です。 この分離レベルは、読み取り専用表に対して照会を実行する場合、または SELECT ステートメントのみを発行する場合で、かつ他のアプリケーションからコミットされていないデータを見られることが問題にはならない場合に適しています。

UR の動作は、読み取り専用カーソルと更新可能カーソルとで違います。
  • 読み取り専用カーソルは、他のトランザクションのほとんどの非コミットの変更にアクセスすることができます。
  • トランザクションの処理中は、他のトランザクションによって作成またはドロップされている表、ビュー、および索引は使用できません。 他のトランザクションによるその他の変更は、 コミットまたはロールバックされる前に読み取ることができます。 UR で作動している更新可能なカーソルは、CS 分離レベルの場合と同じ働きをします。
非コミット読み取りを行うアプリケーションが未確定カーソルを使用する場合、実行時に CS 分離レベルを使用する可能性があります。 PREP または BIND コマンドの BLOCKING オプションの値が UNAMBIG (デフォルト) である場合、未確定カーソルが CS にエスカレートされる場合があります。 このエスカレーションを防ぐには、以下のようにします。
  • アプリケーション・プログラム内のカーソルが未確定とならないように変更します。 SELECT ステートメントを変更して、FOR READ ONLY 節を組み込みます。
  • アプリケーション・プログラム内でカーソルを未確定のままにし、 BLOCKING ALL および STATICREADONLY YES オプションを使ってプログラムをプリコンパイルまたはバインドします。これにより、プログラム実行時に未確定カーソルを読み取り専用として扱えます。

分離レベルの比較

表 1 は、サポートされる分離レベルについて要約しています。
表 1. 分離レベルの比較
  UR CS RS RR
アプリケーションは、他のアプリケーションが処理した変更内容でコミットされていないものを認識できますか? はい いいえ いいえ いいえ
アプリケーションは、他のアプリケーションが処理した変更内容でコミットされていないものを更新できますか? いいえ いいえ いいえ いいえ
ステートメントの再実行は、他のアプリケーション・プロセスに影響される可能性がありますか?1 はい はい はい いいえ 2
更新された行が他のアプリケーション・プロセスにより更新される可能性がありますか? 3 いいえ いいえ いいえ いいえ
更新された行が、UR 以外の分離レベルで実行中の他のアプリケーション・プロセスにより読み取られる可能性がありますか? いいえ いいえ いいえ いいえ
更新された行が、UR の分離レベルで実行中の他のアプリケーション・プロセスにより読み取られる可能性がありますか? はい はい はい はい
アクセスされた行が他のアプリケーション・プロセスにより更新される可能性がありますか? 4 はい はい いいえ いいえ
アクセスされた行が他のアプリケーション・プロセスにより読み取られる可能性がありますか? はい はい はい はい
現在行が他のアプリケーション・プロセスにより更新または削除される可能性がありますか? 5 はい/いいえ 6 はい/いいえ 6 いいえ いいえ
注:
  1. 幻像読み取り現象 の例には、次のようなものがあります。 まず作業単位 UW1 が、ある検索条件を満たしている一連の n 個の行を読み取ります。 作業単位 UW2 が、その同じ検索条件を満たす 1 つ以上の行を挿入してからコミットします。 その後 UW1 が同じ検索条件で読み取りを繰り返すと、別の結果セットが認識されます。 最初に読み取った行のほかに UW2 で挿入された行が追加されています。
  2. 読み取りを行ってから次の読み取りを行うまでの間に、ラベル・ベースのアクセス制御 (LBAC) 資格情報が変化した場合、アクセス可能な行が異なるために、2 度目の読み取りの結果は異なる場合があります。
  3. アプリケーションが表に対する読み取りと書き込みの両方を行っている場合、分離レベルはアプリケーションに保護を提供しません。 例えば、アプリケーションは表でカーソルをオープンし、それからその同じ表に挿入、更新、または削除の操作を実行するとします。 オープン・カーソルでさらに行を取り出してゆくと、アプリケーションが矛盾するデータを見つける場合があります。
  4. 反復不能読み取り現象 の例には、次のようなものがあります。 まず作業単位 UW1 が行を読み取ります。 作業単位 UW2 がその行を変更し、コミットします。 その後 UW1 がもう一度その行を読み取ると、値が異なる場合があります。
  5. ダーティー読み取り現象 の例には、次のようなものがあります。 まず作業単位 UW1 が行を変更します。 UW1 がコミットする前に、作業単位 UW2 がその行を読み取ります。 次に UW1 が変更内容をロールバックすると、UW2 は存在しないデータを読み取ったことになります。
  6. UR または CS では、カーソルが更新可能でない場合、 現在行を他のアプリケーション・プロセスによって更新または削除できる場合もあります。 例えば、バッファリングによって、クライアントの現在行とサーバーの現在行との間に相違が生じる場合があります。 さらに CS で currently committed セマンティクスを使用しているときに、読み取り中の行に非コミット更新保留が含まれる可能性があります。 この場合は、常に現在コミット済みの行がアプリケーションに返されます。

分離レベルのまとめ

表 2 は、さまざまな分離レベルに関連した並行性問題のリストです。
表 2. 分離レベルのまとめ
分離レベル コミットしていないデータへのアクセス 反復不能読み取り 幻像読み取り
反復可能読み取り (RR) 不可能 不可能 不可能
読み取り固定 (RS) 不可能 不可能 可能
カーソル固定 (CS) 不可能 可能 可能
非コミット読み取り (UR) 可能 可能 可能
分離レベルは、アプリケーション間の分離の程度に影響を与えるだけでなく、ロックの獲得と解放に必要な処理とメモリーのリソースが分離レベルごとに異なるため、 個々のアプリケーションのパフォーマンス特性にも影響を与えます。 デッドロックになる可能性も、分離レベルごとに異なります。 表 3 には、 アプリケーションの初期分離レベルを決定するのに役立つ簡単な発見的手法が示されています。
表 3. 分離レベルを選択する指針
アプリケーションのタイプ 高度のデータ安定度が必要 高度のデータ安定度が不要
読み書きトランザクション RS CS
読み取り専用トランザクション RR または RS UR