オプティミスティック・ロック

オプティミスティック・ロック とは、行を選択してから行を更新または削除するまでの間に行ロックを保持しない SQL データベース・アプリケーションのための手法です。

アプリケーションは、アンロックされた行が更新または削除操作の前に変更されることはないという楽観的な仮定の下で作成されます。 行が変更されると更新または削除は失敗します。アプリケーション・ロジックはその種の失敗を、選択を再試行するなどして処理します。 オプティミスティック・ロックの 1 つの利点は、並行性の向上です。 別のアプリケーションはその行の読み取り/書き込みが行えるからです。 ビジネス・トランザクションにデータベース・トランザクションとの相関がない 3 層環境ではオプティミスティック・ロックの手法が使用されます。 ビジネス・トランザクションを越えてロックを維持することができないからです。

しかし、値によるオプティミスティック・ロックにはいくつかの欠点があります。
  • 追加のデータ・サーバー・サポートがない false positives になる可能性がある。これは、オプティミスティック・ロックの使用時の状態で、選択されて以降変更された 行を更新するにはまずその行を再度選択しなければならないという状態のことです。 (これは False Negativeと対比することができます。これは、選択されてから 変更されていない 行を更新するには、最初にその行を再度選択する必要があるという条件です。)
  • アプリケーションにおいて再試行ロジックがさらに必要とされる
  • アプリケーションによる UPDATE 検索条件の作成が複雑である
  • Db2® サーバーが値に基づいてターゲット行を検索することは非効率的です。
  • 一部のクライアントとデータベースのデータ・タイプ (例えばタイム・スタンプ) が一致しないため、すべての列を検索条件付き UPDATE で使用できるわけではない
False Positive が発生しない、より簡単で高速なオプティミスティック・ロックのサポートには、以下の新しい SQL 関数、式、およびフィーチャーがあります。
  • 行 ID (RID_BIT または RID) 組み込み関数
  • ROW CHANGE TOKEN 式
  • 時間に基づく更新の検出
  • 暗黙的な隠し列

Db2 アプリケーションは、検索条件付き UPDATE ステートメントを作成することにより、値によるオプティミスティック・ロック を使用できるようにします。 このステートメントは、選択されたものと全く同じ値を持つ行を検索します。 行の列値が変更されると検索条件付き UPDATE は失敗します。

このプログラミング・モデルを使用するアプリケーションにとって、拡張オプティミスティック・ロック・フィーチャーが有効です。 このプログラミング・モデルを使用しないアプリケーションは、オプティミスティック・ロック・アプリケーションと見なされず、引き続き今までどおりに機能することに注意してください。

行 ID (RID_BIT または RID) 組み込み関数
この組み込み関数は SELECT リストまたは述部ステートメントで使用できます。 例えば、述部 WHERE RID_BIT(tab)=? では、行を効率的に見つけるために、RID_BIT equals 述部が新規の直接アクセス方式としてインプリメントされます。 以前は、選択されたすべての列値を述部に追加し、単一行だけを修飾する一部の固有列の組み合わせに依存することにより、効率の劣るアクセス方式で値付きオプティミスティック・ロックと言われる値が行われていました。
ROW CHANGE TOKEN 式
この新しい式では、トークンを BIGINT として返します。 トークンは、行の変更順序内の相対点を表します。 アプリケーションは行の現在の ROW CHANGE TOKEN 値と、行が最後にフェッチされたときに保管された ROW CHANGE TOKEN 値を比較して、行が変更されたかどうかを判別できます。
時間に基づく更新の検出:
このフィーチャーは、RID_BIT() と ROW CHANGE TOKEN を使用して SQL に追加されます。 このフィーチャーをサポートするには、タイム・スタンプ値を保管するための新規生成列を表に定義する必要があります。 これは ALTER TABLE ステートメントを使用して既存の表に追加できます。また、列は新規表を作成するときに定義できます。 この列の存在もオプティミスティック・ロックの動作に影響を与えます。 つまり、ROW CHANGE TOKEN の細分性をページ・レベルから行レベルに上げるためにこの列が使用されることで、オプティミスティック・ロック・アプリケーションのメリットが大幅に向上します。 この機能は、 Db2 for z/OS®にも追加されました。
暗黙的な隠し列:
このフィーチャーは、互換性を提供するために RID_BIT 列と ROW CHANGE TOKEN 列の既存の表とアプリケーションへの導入を容易にします。 暗黙的な列リストを使用する場合、暗黙的な隠し列は外部化されません。 例えば、以下のようにします。
  • 表に対して SELECT * を発行しても、結果表に暗黙的な隠し列は戻されません。
  • 列リストを持たない INSERT ステートメントは暗黙的な隠し列の値を予期しませんが、列で NULL を許可するかまたは列が別のデフォルト値を持つように定義する必要があります。
注: オプティミスティック並行性制御ペシミスティック・ロックROWID、および 更新検出などのオプティミスティック・ロック用語の定義については、 Db2 用語集を参照してください。