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 = 10WHERE C1 > 0 AND C1 <> 10 ;
△
UPDATE T1 SET C1 = C1 + 10 WHERE C1 > 0 ;×
UPDATE T1 SET C1 = 10 WHERE C1 > 0 ;C1の更新後の値がヒットしないよう
な探索条件を指定する。図 8
-
1-
1UPDATE
で探索条件に使用するインデクスを更新する場合更新値の指定にスカラ演算を含む 場合は、作業表にデータを一旦退避 するので二重更新することはない。
探索条件で使用するインデクスの 構成列を更新する場合は、更新行 数が二重にカウントされるので注意 が必要。
更新に関する記述
インデクス定義 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
の更新後の値が ヒットしないような探索 条件を指定する図 8
-
1-
2 カーソルを用いた更新で探索条件に使用するインデクスを更新する場合 検索で使用するインデクスの構成 列を更新する場合は注意が必要。以下のいずれかの指定の場合、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)