スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド

[目次][索引][前へ][次へ]

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

インデクスキー値無排他とは,インデクスキー値で排他制御をしないことをいいます。この場合,表のデータだけで排他制御をします。

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

<この項の構成>
(1) 適用基準
(2) インデクスキー値無排他の指定方法
(3) デッドロック回避の例
(4) 注意事項

(1) 適用基準

インデクスキー値無排他は基本的に適用することをお勧めします。

ただし,ユニークインデクスの一意制制約保証処理の動作,残存エントリ,及び表データ更新時に出力されるシステムログ量を考慮した上で決めてください。ユニークインデクスの一意制制約保証処理の動作,残存エントリについては,「(4)(b) ユニークインデクスの残存エントリ」を参照してください。また,表データ更新時に出力されるシステムログ量については,マニュアル「HiRDB Version 8 システム導入・設計ガイド」を参照してください。

(2) インデクスキー値無排他の指定方法

インデクスキー値無排他を適用する場合,システム定義のpd_indexlock_modeオペランドにNONEを指定します。pd_indexlock_modeオペランドについては,マニュアル「HiRDB Version 8 システム定義」を参照してください。

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

(3) デッドロック回避の例

図3-8のようにデッドロックが発生した場合,インデクスキー値無排他を適用するとデッドロックを回避できます。インデクスキー値無排他によるデッドロック回避の例を次の図に示します。

図3-12 インデクスキー値無排他によるデッドロック回避の例

[図データ]

(4) 注意事項

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

インデクスキー値無排他を適用している場合,一意性制約定義が指定されている表では,行追加更新時での一意性制約保証処理の動作がインデクスキー値方式(インデクスキー値無排他ではない方式)とは異なります。インデクスキー値無排他を適用する場合は,この動作の違いを考慮しておく必要があります。

一意性制約の保証処理とは,行データの挿入,又は列値更新のときに,インデクス(ユニークインデクス)を使用して追加しようとしているキーを持つデータが既に表にあるかをチェックするとともに,排他制御で追加キーの一意性を保証する処理のことをいいます。

一意性制約の保証処理では,同一キーを持つインデクスキーエントリが見つかった場合,すぐにユニークエラーとなります。そのインデクスキーを操作している相手トランザクションが未決着状態で,ロールバックする可能性があったとしても,排他制御でのチェックをしないですぐにユニークエラーとなります。

一意性制約を指定した表データの挿入,又は更新処理の場合,トランザクションの決着を待つことよりも処理を続行することを優先したいときには,インデクスキー値無排他を適用してください。また,待ってでも挿入,又は更新処理を試みる方を優先したい場合には,インデクスキー値排他を適用するか,pd_lock_uncommited_delete_dataオペランドにWAITを指定して,コミットしていない削除データに対して排他を行ってください。コミットしていない削除データの排他制御については,「3.4.7 コミットしていない削除データの排他制御」を参照してください。

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

インデクスキー値無排他を適用する場合,ユニークインデクスで排他待ち,及びデッドロックが発生することがあります。

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

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

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

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