3.4.10 UAPでできる排他制御
排他制御は,HiRDBシステムが自動的に制御していますが,処理形態によってはUAPで排他制御の単位を変更すると,オーバヘッドが削減できるので処理効率が向上します。UAPを作成するとき次に示す点を考慮してください。
(1) 検索の場合
-
検索結果を一度参照するだけで,COMMITするまでデータを占有する必要がないときはSELECT文にWITHOUT LOCKを指定します。WITHOUT LOCKを指定すると,トランザクションの終了を待たないで排他が解除されるので,同時実行性が向上します。
なお,WITHOUT LOCK NOWAITを指定しても,データベース作成ユティリティ(option文のnowait=noを指定した場合),又はデータベース再編成ユティリティ(-k unldの場合を除く)でデータ処理中の表は検索できません。
また,WITHOUT LOCK NOWAITを指定した場合,排他資源の表(NOWAIT検索中)に対して,排他モード(EX)を取得する次のユティリティとの間にデッドロックが発生するおそれがあります。
-
データベース作成ユティリティ(pdload)
-
データベース再編成ユティリティ(pdrorg)
データベース作成ユティリティの排他制御モード,及びデータベース再編成ユティリティの排他制御モードについては,マニュアル「HiRDB コマンドリファレンス」を参照してください。
-
-
1以外の場合は,検索する前に,対象の表にLOCK文でSHAREモードの排他を掛けます。
LOCK文であらかじめ表に排他を掛けると,ページ単位,又は行単位の排他をしないため,オーバヘッドが大幅に削減できます。また,排他制御用のバッファ不足を防止することもできます。
-
共用表を検索する場合,WITHOUT LOCK,又はWITH ROLLBACKを指定することをお勧めします。
(2) 更新の場合
-
更新する前に,対象の表にLOCK文でEXCLUSIVEモードの排他を掛けます。
LOCK文であらかじめ表に排他を掛けると,行単位の排他をしないため,オーバヘッドが大幅に削減できます。また,排他制御用のバッファ不足を防止することもできます。
-
共用表に対して,インデクスのキー値の変更を伴う更新(追加,削除も含む)をする場合,及び大量の更新をする場合,必ずEXCLUSIVE指定のLOCK文で排他を掛けてください。なお,共用表にEXCLUSIVE指定のLOCK文で排他を掛けた場合,共用表に定義されているインデクスのインデクス格納用RDエリア(共用RDエリア)にも排他が掛かります。
(3) 削除の場合
-
表の削除,インデクスの削除,又は全行削除をする場合,対象となる表のすべての使用中セグメントに対してEXモードの排他を掛けます。
なお,表の使用中セグメント数が多い場合,すべてのセグメントに対してEXモードの排他を掛けるため,COMMITするまでこれらすべてのセグメントを占有することになり,排他制御用バッファ内で多量の排他制御用資源管理テーブルを必要とするので注意する必要があります。特に,次に示すSQL文を使用して表の削除,インデクスの削除,又は全行削除をする場合は,注意してください。
-
DROP SCHEMA
-
DROP TABLE
-
DROP INDEX
-
ALTER TABLE DROP PRIMARY KEY
-
PURGE TABLE
-
-
複数の表を所有するスキーマを削除する場合,各々の表を削除してからスキーマを削除します。
各表を削除した後にスキーマを削除すると,使用するメモリが軽減できます。
(4) 注意事項
-
LOCK文で表に排他を掛けると,ほかのトランザクションが長時間待ち状態になるため,オンライン業務との同時実行は避けてください。ただし,非共用表のNOWAIT検索については,待ち状態にはなりません。
-
共用表に対してNOWAIT検索をする場合,アクセスするRDエリアに対して,ほかのユーザがEXCLUSIVE指定のLOCK文を実行しているときはアクセスできません。