LOCK TABLE ステートメント

LOCK TABLE 文は、現在のサーバーのテーブル、テーブル・スペース、またはテーブル・スペース・パーティションに対するロックを要求します。 プロセスがすでに適切なロックを保持している場合、新しいロックは取得されません。

呼びかけ LOCK TABLE

このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 このステートメントは、動的に作成できる実行可能ステートメントです。

承認 LOCK TABLE

以下に定義する特権セットには、少なくとも次のいずれかが含まれていなければいけません。

  • 識別されたテーブルのSELECT権限 (SELECT権限は補助テーブルには適用されない)
  • 表の所有権
  • データベースの DBADM 権限
  • SYSADM または SYSCTRL 権限
  • DATAACCESS 権限

データベースが暗黙的に作成される場合、データベース特権は暗黙的なデータベースまたは DSNDB04 上になければなりません。

特権セット:

アプリケーション・プログラムにこの ステートメントを組み込む場合、特権セットは、プランまたはパッケージの所有者が持つ特権となります。 ステートメントが動的に準備される場合、特権セットは有効なDYNAMICRULES動作(run、bind、define、またはinvoke)によって決定され、 1に要約されています。 (これらの動作を決定する DYNAMICRULES バインドオプション値の一覧など、 これらの動作の詳細については、 認可 ID と動的 SQL を参照してください)

構文 LOCK TABLE

構文図を読むビジュアルシンタックスダイアグラムをスキップするLOCK TABLEtable-namePARTITION整数IN SHAREEXCLUSIVE MODE

説明の対象: LOCK TABLE

テーブル名
ロックする表を指定します。 この名前は、現行サーバーに存在する表を示すものでなければなりません。 変更の開始ビュー、(作成または宣言された)一時テーブル、アクセラレータ専用テーブル、カタログ・テーブル、ディレクトリ・テーブルを識別してはならない。変更の終わり このロックは、そのテーブルだけに適用される場合もあるし、そうでない場合もある。 補助表をロックすると、その補助表を含む LOB 表スペースがロックされます。
パーティション 整数

ロックするパーティション化表スペースのパーティションを指定します。 table-name に指定する表は、パーティション化表スペースに 属している必要があります。 integer に指定する値は、 表スペースのパーティション数より大きくない整数でなければなりません。

パーティショニングされたテーブルスペース内のテーブルのPARTITION句を省略すると、すべてのパーティションがロックされます。

IN SHARE MODE
補助表ではない表に対するロックの場合、他のプロセスでは表に対する読み取り専用操作 しかできないようにするロックの獲得を要求します。 LOB 表スペースに対するロックの場合、IN SHARE モードは、ストレージが再割り当てされないようにする ロックを要求します。 LOB 表スペースがロックされると、他のプロセスは、LOB を削除したり、 それらを NULL 値に更新することはできますが、非 NULL 値を用いた LOB を挿入することはできません。 このステートメントの実行後にプロセスが保持するロックのタイプは、 プロセスが既に保持しているロックがあれば、それがどのような ロックなのかによって異なります。
IN EXCLUSIVE MODE
アプリケーション・プロセス用に排他ロックを獲得するように要求します。 ロックが解除されるまでは、表に対するどのような操作も並行する プロセスでは実行できないようにします。
例外です: 変更の開始例外:ロックがLOBテーブル・スペース、パーティショニングされた(UTSでない)テーブル・スペース、またはユニバーサル・テーブル・スペース(UTS)でない限り、コミットされていない読み取り(UR)の分離レベルで実行されている同時プロセスは、テーブルに対して読み取り専用の操作を実行できます。 CURRENTDATA(NO)でカーソル安定性(CS)の分離レベルで実行されている並行プロセスは、ロック回避が既にコミットされているデータの読み取りに使用されている場合、テーブル上で読み取り専用操作を実行することができます。変更の終わり

表スペース、表、またはパーティションの排他ロックは、他のトランザクションがロックされたオブジェクトに対する要求を保持することを妨げるものではないことに注意してください。

注釈 LOCK TABLE

LOCK TABLE文で取得したロック

LOCK TABLE ステートメントの発行時に獲得されるロックは、要求されるモードと表スペースのタイプによって異なります。

ほとんどのテーブルスペースの種類では、LOCK TABLE 文はテーブルスペースまたは特定のパーティションにロックを取得します。 セグメント化された(UTSではない)テーブルスペースでは、LOCK TABLE文は個々のテーブルに適用されます。

以下の表は、LOCK TABLE 文で取得されたロックのモードを、セグメント化されたテーブルスペースと非セグメント化されたテーブルスペースで示しています。

表 1. LOCK TABLE が取得したロックの種類。 パーティションでの LOCK TABLE は、非セグメント表スペースと同じ動作になります。
LOCK TABLE In UTSまたは非分割テーブル空間 セグメント化表スペース セグメント化テーブルスペース内のテーブル
EXCLUSIVE MODE X X IX
SHARE MODE SまたはSIX1 SまたはSIX1 IS
注:
  1. 処理で既に IX ロックが保持されている場合は、SIX ロックが獲得されます。 処理で既にモード SIX、U、または X のロックが保持されている場合、SHARE MODE の効果はありません。
LOCK TABLE文で取得したロックの解放

LOCK TABLE文では、作業単位の最後に有効なRELEASEバインド・オプションが、 Db2 、ロックを解放するタイミングを制御する。 LOCK TABLE文の実行時に有効なRELEASEオプションは、アプリケーションが異なるRELEASEオプションの下で後続の文を発行した場合に変更される可能性があります。 詳しくは RELEASEバインドオプションを参照のこと。

RELEASE(DEALLOCATE)オプションが有効な場合、 Db2 、アプリケーション終了時にプランがデアロケートされるとロックが解放されます)

RELEASE(COMMIT)オプションが有効な場合、 Db2 、テーブルまたはテーブル空間が保持されたカーソルによって参照されていない限り、次の作業単位の終了時(COMMITまたはROLLBACK)にロックを解放する。 保持されたカーソルにより、 Db2 、準備されたステートメントを作業単位の終了後もメモリに保持することができる。 この場合、 Db2 、プリペアド・ステートメントがメモリーから解放されるまでロックを保持する。

ユニバーサル・テーブル・スペース(UTS)のポイントの作業単位の終わりを過ぎてもロックが保持されている場合、新しいユーザーがサインオンすると、 Db2、前のスレッドが発行したLOCK TABLEステートメントから継承したロックを解放する。

非UTSテーブル空間のテーブルに対して、作業単位の終了を過ぎてもロックが保持されている場合、作業単位の終了時にインテント・ロックに降格される。

構文の選択肢と同意語
Db2 の以前のリリースとの互換性を保つため、PART は PARTITION の同義語として指定することができます。

例) LOCK TABLE

パーティショニングされたテーブルスペースに存在する DSN8C10.EMPというサンプルテーブルをロックします。 獲得されたロックはすべてのパーティションに適用され、他のアプリケーション・プログラムがその表を読み取ることも更新することもできなくします。 ただし、上記の 例外に記載されているいずれかの条件の下では、Db2 は表に対する読み取り専用操作を許可する可能性があります。
LOCK TABLE DSN8C10.EMP IN EXCLUSIVE MODE;