• 検索結果がありません。

更新に関する記述

ドキュメント内 HiRDB SQLコーディングガイドライン (ページ 75-78)

READ UNCOMMITED:

8. 更新に関する記述

更新処理では二重更新、排他待ちやデッドロックになる場合があります。

これらを起こさないための

SQL

コーディングについて示します。

© Hitachi, Ltd. 2013 , 2015. All rights reserved.

8-1 更新 SQL での二重更新に対する注意(1)

75

UPDATE

にて更新後の値が、インデクスで絞り込んだ範囲に含まれる場合、同一行を

二重更新(二回更新)することがあります。

DB

の整合性は保たれますが、

SQL

連絡領域 の更新行数には述べ更新行数が通知されます。更新行数を意識するアプリケーションで は、注意してください。例を図 8-1-1に示します。

Point

インデクスを使用して絞り込んだデータに対し、そのインデクス構成列の更新を

する場合は、更新後の値が探索条件にヒットしないように記載する

UPDATE T1 SET C1 = 10

WHERE C1 > 0 AND C1 <> 10 ;

UPDATE T1 SET C1 = C1 + 10 WHERE C1 > 0 ;

×

UPDATE T1 SET C1 = 10 WHERE C1 > 0 ;

C1の更新後の値がヒットしないよう

な探索条件を指定する。

-

-

UPDATE

で探索条件に使用するインデクスを更新する場合

更新値の指定にスカラ演算を含む 場合は、作業表にデータを一旦退避 するので二重更新することはない。

探索条件で使用するインデクスの 構成列を更新する場合は、更新行 数が二重にカウントされるので注意 が必要。

更新に関する記述

インデクス定義 T1(C1)

8-1 -1 更新 SQL での二重更新に対する注意(2)

カーソルを使った更新でも、同様に二重更新されることがあるので、更新後の値が探索 条件にヒットしないようにしてください。例を図 8-1-2に示します。

SELECT C2 FROM T1 WHERE C1 > 0 AND C1 <> 10 WITH EXCLUSIVE LOCK FOR UPDATE ;

UPDATE T1 SET C1 = 10 WHERE CURRENT OF カーソル名 ;

×

SELECT C2 FROM T1 WHERE C1 > 0 WITH EXCLUSIVE LOCK FOR UPDATE ;

UPDATE T1 SET C1 = 10 WHERE CURRENT OF カーソル名 ;

C1

の更新後の値が ヒットしないような探索 条件を指定する

-

-

カーソルを用いた更新で探索条件に使用するインデクスを更新する場合 検索で使用するインデクスの構成 列を更新する場合は注意が必要。

以下のいずれかの指定の場合、UPDATEで探索条件に使用するインデクス構成列を更新すると、

必ず作業表にデータを一旦退避するので、二重更新されることはありません。しかし作業表作成 のオーバヘッドかかるため、性能が劣化します。

システム定義に、

pd_indexlock_mode =KEY

(デフォルトは

NONE

:「インデクスキー値無排

他」)を指定

 SQL

最適化オプションから

"DETER_WORK_TABLE_FOR_UPDATE"

(デフォルトで仮定さ れる:「更新

SQL

の作業表作成抑止」)を外す

<補足事項>

更新に関する記述

インデクス定義 T1(C1)

© Hitachi, Ltd. 2013 , 2015. All rights reserved.

ドキュメント内 HiRDB SQLコーディングガイドライン (ページ 75-78)