アプリケーション・プロセスに関連付けられた分離レベル は、 そのプロセスによりアクセスされているデータのロックの度合い、または並行して実行されている他のプロセスからそのデータを分離する度合いを決定します。 分離レベルは、作業単位の持続期間内で有効です。
静的 SQL ステートメントの分離レベルは、パッケージの属性として指定され、 そのパッケージを使用するアプリケーション・プロセスに適用されます。 分離レベルは、ISOLATION バインドまたはプリコンパイル・オプションを設定することにより、プログラム準備処理中に指定されます。 動的 SQL ステートメントの場合、デフォルトの分離レベルは、ステートメントを作成するパッケージに指定された分離レベルです。 SET CURRENT ISOLATION ステートメントを使用すると、セッション内で発行される動的 SQL ステートメントに対して別の分離レベルを指定できます。 詳しくは、『CURRENT ISOLATION 特殊レジスター』を参照してください。 静的 SQL ステートメントと動的 SQL ステートメントのどちらの場合でも、select-statement 内の isolation-clause は、特殊レジスター (設定されている場合) と BIND オプションの両方の値をオーバーライドします。 詳しくは、『Select-statement』を参照してください。
分離レベルはロックにより施行され、並行アプリケーション・プロセスによるデータ・アクセスは、 使用されるロックのタイプに応じて制限または禁止されます。 宣言済み一時表とその行は、宣言したアプリケーションしかアクセスできないので、ロックされることはありません。
これ以降では、それぞれの分離レベルの詳細について、パフォーマンスへの影響の大きい順に説明されています。ただし、データにアクセスしたりデータを更新したりする場合には、後で説明されているものほど注意が必要になります。
反復可能読み取り 分離レベルでは、1 つの作業単位 (UOW) の間にアプリケーションが参照する行がすべてロックされます。 アプリケーションが同じ作業単位の中で 2 回 SELECT ステートメントを発行した場合には、いずれの場合も同じ結果が返されます。 RR では、更新の消失の可能性はなく、コミットされていないデータへのアクセス、反復不能読み取り、および幻像読み取りは行えません。
RR では、アプリケーションは、UOW が完了するまでに、必要な回数だけ行の取得および操作を行えます。 しかしそれ以外のアプリケーションは、その UOW が完了するまで、結果セットに影響を与える行を更新、削除、または挿入することができません。 RR 分離レベルの下で実行されるアプリケーションは、コミットされていない他のアプリケーションによる変更は認識できません。 この分離レベルでは、戻されるデータすべてをアプリケーションが認識するまでは、一時表や行ブロッキングが使用されている場合であっても、それらのデータはすべて未変更のままになります。
取得される行だけでなく、参照されるすべての行がロックされます。 例えば、10 000 個の行をスキャンしてそれらに述部を適用する場合、たとえ 10 行しか適格でなくても、それら 10 000 個の行すべてにロックがかけられます。 照会が再度実行された場合には、照会によって参照される行のリストに加えられることになる行については、別のアプリケーションが挿入または更新を行うことができません。 これにより、幻像読み取りを防ぎます。
RR は多数のロックを獲得できるため、この数が locklist および maxlocks データベース構成パラメーターで指定した限度を超える可能性があります。 ロック・エスカレーションが発生する可能性がある場合、ロック・エスカレーションを避けるために、 オプティマイザーは索引のスキャンのために単一表レベル・ロックを獲得することがあります。 表レベルのロックをかけたくない場合は、読み取り固定分離レベルを使用します。
参照制約を評価する際、ユーザーが以前に設定した分離レベルに関係なく、外部表のスキャン時に使用される分離レベルが DB2® サーバーによって RR にアップグレードされることがあります。 これが起こるとさらに多くのロックがコミットの時まで保持されるため、デッドロックやロックのタイムアウトが発生する可能性が高くなります。 これらの問題を避けるには、外部キー列のみが含まれる索引を作成し、参照整合性スキャンでそれを代わりに使用できるようにします。
読み取り固定 分離レベルでは、 ある作業単位の間にアプリケーションが取得する行のみにロックをかけます。 RS により、ある UOW で適格とされて読み取られた行は、 その UOW が完了するまで他のアプリケーション・プロセスによって変更できなくなり、 また別のアプリケーション・プロセスによって変更されたすべての行は、 そのプロセスによって変更がコミットされるまで読み取れなくなります。 RS では、コミットされていないデータへのアクセスおよび反復不能読み取りは行えません。 ただし、幻像読み取りは行えます。
この分離レベルでは、戻されるデータすべてをアプリケーションが認識するまでは、一時表や行ブロッキングが使用されている場合であっても、それらのデータはすべて未変更のままになります。
RS 分離レベルでは、高度の並行性が提供されると共に、データの表示が一定になります。 この目的を達成するため、オプティマイザーは、ロック・エスカレーションが発生するまで表レベル・ロックがかけられないようにします。
カーソル固定 分離レベルは、トランザクションの際にアクセスする行にカーソルを置いたまま、その行をロックします。 このロックは、次の行が取り出されるか、またはトランザクションが終了する時まで有効です。 しかし、行の中の何らかのデータが変更された場合、変更がコミットされるまでロックは保持されます。
この分離レベルでは、更新可能なカーソルがある行に置かれている間、他のアプリケーションはその行を更新したり削除したりできません。 CS では、他のアプリケーションの非コミット・データにアクセスすることはできません。 ただし、反復不能読み取りおよび幻像読み取りは行えます。
CS はデフォルトの分離レベルです。 コミットされたデータだけを認識する必要があり、並行性を最大にする場合にこれは適しています。
非コミット読み取り 分離レベルでは、アプリケーションが他のトランザクションの非コミットの変更にアクセスできます。 さらに UR の場合、別のアプリケーションが表を変更またはドロップしようとするのでない限り、読み取り中の行に別のアプリケーションがアクセスすることが可能です。
UR では、コミットされていないデータへのアクセス、反復不能読み取り、および幻像読み取りが可能です。 この分離レベルは、読み取り専用表に対して照会を実行する場合、または SELECT ステートメントのみを発行する場合で、かつ他のアプリケーションからコミットされていないデータを見られることが問題にはならない場合に適しています。
UR | CS | RS | RR | |
---|---|---|---|---|
アプリケーションは、他のアプリケーションが処理した変更内容でコミットされていないものを認識できますか? | はい | いいえ | いいえ | いいえ |
アプリケーションは、他のアプリケーションが処理した変更内容でコミットされていないものを更新できますか? | いいえ | いいえ | いいえ | いいえ |
ステートメントの再実行は、他のアプリケーション・プロセスに影響される可能性がありますか?1 | はい | はい | はい | いいえ 2 |
更新された行が他のアプリケーション・プロセスにより更新される可能性がありますか? 3 | いいえ | いいえ | いいえ | いいえ |
更新された行が、UR 以外の分離レベルで実行中の他のアプリケーション・プロセスにより読み取られる可能性がありますか? | いいえ | いいえ | いいえ | いいえ |
更新された行が、UR の分離レベルで実行中の他のアプリケーション・プロセスにより読み取られる可能性がありますか? | はい | はい | はい | はい |
アクセスされた行が他のアプリケーション・プロセスにより更新される可能性がありますか? 4 | はい | はい | いいえ | いいえ |
アクセスされた行が他のアプリケーション・プロセスにより読み取られる可能性がありますか? | はい | はい | はい | はい |
現在行が他のアプリケーション・プロセスにより更新または削除される可能性がありますか? 5 | はい/いいえ 6 | はい/いいえ 6 | いいえ | いいえ |
注:
|
分離レベル | コミットしていないデータへのアクセス | 反復不能読み取り | 幻像読み取り |
---|---|---|---|
反復可能読み取り (RR) | 不可能 | 不可能 | 不可能 |
読み取り固定 (RS) | 不可能 | 不可能 | 可能 |
カーソル固定 (CS) | 不可能 | 可能 | 可能 |
非コミット読み取り (UR) | 可能 | 可能 | 可能 |
アプリケーションのタイプ | 高度のデータ安定度が必要 | 高度のデータ安定度が不要 |
---|---|---|
読み書きトランザクション | RS | CS |
読み取り専用トランザクション | RR または RS | UR |