5.6.1 LOCK文の形式と規則
(1) 機能
指定した表に排他制御をします。HiRDBが自動的に排他制御する行,又はキー値単位より大きな単位で排他制御をするため,行,又はキー値単位の場合に比べて排他制御によるオーバヘッドを削減できます。
(2) 使用権限
表に対するSELECT権限を持つユーザが,その表に共用モードの排他を掛けられます。
表に対するINSERT権限,UPDATE権限,又はDELETE権限を持つユーザが,その表に排他モードの排他を掛けられます。
(3) 形式
LOCK TABLE 〔認可識別子.〕表識別子 〔,〔認可識別子.〕表識別子〕… 〔IN{SHARE|EXCLUSIVE } MODE〕 〔UNTIL DISCONNECT〕 〔{WITH ROLLBACK|NO WAIT|NOWAIT}〕
(4) オペランド
(a) 〔認可識別子.〕表識別子〔,〔認可識別子.〕表識別子〕…
- 認可識別子
-
排他制御をする表の所有者の認可識別子を指定します。
- 表識別子
-
排他制御をする表の名称を指定します。
表識別子にビュー表を指定した場合は,ビュー表の基になる実表に対して排他制御をします。この場合,ビュー表には排他制御はしません。
表識別子に一時表を指定した場合,指定は無視されます。
表名は最大128個指定できます。また,表名は重複してもかまいません。
(b) 〔IN SHARE MODE〕
排他制御をする表のデータを,ほかのユーザが参照することは許すが,更新することは許さない(共用モード)場合に指定します。このオペランドを指定したLOCK文発行後の表アクセス時に,共用モードの行,及びキー値の排他資源が削減されます。
(c) 〔IN EXCLUSIVE MODE〕
排他制御をする表のデータを,ほかのユーザが参照することも,更新することも許さない(排他モード)場合に指定します。ただし,ほかのユーザが排他オプションWITHOUT LOCK NOWAITを指定して検索した場合を除きます。このオペランドを指定したLOCK文発行後の表アクセス時に,共用モードの行,キー値,及び排他モードの行,キー値の排他資源が削減されます。
(d) 〔UNTIL DISCONNECT〕
DISCONNECTするまで排他制御をする場合に指定します。省略した場合,トランザクションの終了まで排他制御をします。
(e) {WITH ROLLBACK|NO WAIT|NOWAIT}
ほかのユーザと排他が競合した場合,待たないでエラーを受け取るときに指定します。省略した場合,排他が競合したときは,排他が解除されるまで,又はシステム定義のpd_lck_wait_timeoutオペランドで指定した時間まで待ちます。
- WITH ROLLBACK
-
排他制御をする表をほかのユーザが使用している場合,トランザクションを取り消して無効にするときに指定します。
- NO WAIT
-
排他制御をする表が他ユーザで使用されているとき,トランザクションを取り消さないでこのSQL文を無効にする場合,指定します。
- NOWAIT
-
NO WAITを指定した場合と同じです。
(5) 共通規則
-
排他制御をする実表が重複する場合は,重複排除されます。一つのLOCK文で排他制御できる実表の合計は,最大128個です。
-
データディクショナリ表には,排他制御はできません。
-
排他制御をしているとき,更にLOCK文を実行した場合,排他期間は長い方へ,又排他レベルは強い方へ遷移します。このため,排他期間を短くする,又は排他レベルを下げる指定をしたLOCK文を実行しても,排他期間及び排他レベルは変更されません。
排他期間の長さと排他レベルの強弱を次の図に示します。
図5‒1 排他期間の長さと排他レベルの強弱 -
LOCK文発行後にPURGE TABLE文を実行すると,排他レベルがEXCLUSIVEに遷移します。この場合,PURGE TABLE文実行前にトランザクションを終了させると,PURGE TABLE文を実行してもEXCLUSIVEには遷移しません。
-
UNTIL DISCONNECTを指定して排他制御をしている表が,DROP TABLE文などで削除された場合,その表に対する排他制御はHiRDBシステムによって自動的に解除されます。
(6) 留意事項
-
通常,HiRDBが排他制御をするので,排他制御の単位を変える場合だけLOCK文を使用してください。
-
UNTIL DISCONNECTを指定した場合,クライアント環境定義のPDXAMODEの指定によって,排他制御の期間が異なります。PDXAMODE及び排他制御については,マニュアル「HiRDB UAP開発ガイド」を参照してください。
-
共用表に対して排他モード(IN EXCLUSIVE MODE)でLOCK文を実行した場合,共用表のほかに次のRDエリアも排他制御の対象となります。
-
共用表を格納しているRDエリア
-
共用表にインデクスが定義されている場合,そのインデクスを格納しているRDエリア
共用表に対する排他制御については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。
-
(7) 使用例
同じトランザクション中で,在庫表(ZAIKO)を全件検索するため,この表に共用モードの排他制御をします。
LOCK TABLE ZAIKO IN SHARE MODE