Hitachi

ノンストップデータベース HiRDB Version 10 解説


3.4.6 インデクスキー値無排他

インデクスキー値に排他を掛けないで,表のデータだけに排他を掛けて表にアクセスすることをインデクスキー値無排他といいます。

インデクスキー値無排他を適用すると,次に示す問題を回避できます。

インデクスキー値無排他を使用すると,インデクスを利用した検索処理ではインデクスキー値に排他を掛けません。また,表に対する更新処理(行挿入,行削除及び列値更新)の場合にも,更新対象列に定義されているインデクスのインデクスキー値に対して排他は掛けません。

〈この項の構成〉

(1) 適用基準

どの業務でも,インデクスキー値無排他を使用することをお勧めします。ただし,ユニークインデクスの動作,残存エントリ及びインデクスログ量を考慮した上で決めてください。ユニークインデクスの一意性制約保証処理の動作,残存エントリについては,「注意事項」を参照してください。インデクスキー値無排他を使用するときのインデクスログ量については,マニュアル「HiRDB システム導入・設計ガイド」のインデクスログ量と排他資源数の見積もりの説明を参照してください。

(2) 指定方法

インデクスキー値無排他を使用する場合は,システム共通定義のpd_indexlock_modeオペランドにNONEを指定します。

【UNIX版の場合の留意事項】

システム定義のpd_inner_replica_controlオペランドの指定値が1より大きいとき,システム定義のpd_indexlock_modeオペランドの指定に関係なく,pd_indexlock_modeオペランドにはNONEが仮定されます。

(3) インデクスキー値無排他を使用した場合のデッドロック回避の例

インデクスキー値無排他を使用した場合のデッドロック回避の例について説明します。ここで説明するデッドロックの例を次の図に示します。排他制御モードについては,「排他制御モード」を参照してください。

図3‒33 デッドロックの例(インデクスキー値無排他を使用しない場合)

[図データ]

インデクスキー値無排他を指定しておくと,図「デッドロックの例(インデクスキー値無排他を使用しない場合)」のようなデッドロックを回避できます。インデクスキー値無排他を使用した場合のデッドロック回避の例を次の図に示します。

図3‒34 インデクスキー値無排他を使用した場合のデッドロック回避の例

[図データ]

(4) 注意事項

(a) ユニークインデクスの一意性制約保証処理の動作

一意性制約定義が指定されている表では,インデクスキー値無排他の場合とそうでない場合とで,行の追加及び更新時に行われる一意性制約の保証処理の動作が異なります。一意性制約の保証処理とは,行データの挿入,又は列値更新のときに,インデクス(ユニークインデクス)を使用して追加しようとしているキーを持つデータが既に表にあるかをチェックするとともに,排他制御で追加キーの一意性を保証する処理のことをいいます。一意性制約の保証処理では,同一キーを持つインデクスキーエントリが見付かった場合,エラーとなります。そのインデクスキーを操作している相手トランザクションが未決着状態で,ロールバックする可能性があったとしても,排他制御でのチェックをしないでエラーとなります。

一意性制約を指定した表データの挿入,又は更新処理をする場合に,待つことよりも処理を続行することを優先したいときには,インデクスキー値無排他を適用してください。また,待ってでも挿入,又は更新処理を試みる方を優先したい場合には,インデクスキー値無排他を適用しないでください。

(b) ユニークインデクスの残存エントリ

インデクスキー値無排他を適用する場合,ユニークインデクスで排他待ち,及びデッドロックが発生することがあります。インデクスキー値無排他でのユニークインデクスでは,一意性制約保証のためにDELETE文,又はUPDATE文実行前のインデクスキーをインデクス上から削除しないで残すようにしています。この残っているインデクスキーのことを残存エントリといいます。この残存エントリは,トランザクション決着後の適当なタイミングで削除されますが,残存エントリと同一のキーに対するINSERT文,又はUPDATE文を実行した場合,タイミングによっては予想外に待たされたり,デッドロックが発生したりすることがあります。

これらを回避するためには,一意性制約の列を更新しないようにUAPを作成する必要があります。

(5) インデクスキー値無排他を適用しても回避できないデッドロック

UAPのアクセス順序によって,インデクスキーとインデクスキーとでデッドロックが発生することがあります。これを回避するためには,一意性制約の列を更新しないようにUAPを作成しなければなりません。