11.14.1 WITHOUT ROLLBACKオプションの効果と適用基準
WITHOUT ROLLBACKオプションとは,表に対しての更新処理(追加,削除を含む)の完了を契機に,その更新行に対する排他が解除され,それ以降はロールバックされなくなるオプションのことです。
(1) WITHOUT ROLLBACKオプションを指定したときの効果
表にWITHOUT ROLLBACKオプションを指定したときの効果を次に示します。
- 性能の向上
-
更新処理完了時に排他が解除されるので,排他待ちの発生を削減できます。
(2) 適用基準
採番業務のような,更新処理が集中する表に適しています。
伝票番号や書類番号などの採番業務では,一つの表で番号を管理し,採番するごとにカウントアップするという方法が考えられます。しかし,この方法では処理が集中すると,COMMIT発行まで排他が解除されないため,排他待ちが多く発生することが考えられます。このような処理をする場合,その表にWITHOUT ROLLBACKオプションを指定すると,カウントアップが終了した時点で排他が解除されるため,排他待ちの発生を削減できます。採番業務の例を次の図に示します。
この例では,1行で1種類の番号を管理しています。
図「採番業務の例」に示した採番管理表の定義例を次に示します。
CREATE TABLE 採番管理表 (種類 NCHAR(4), 採番 INT) : WITHOUT ROLLBACK
ただし,次に示す要因で欠番が発生する可能性がありますので,欠番が発生しても問題がない業務で使用してください。
-
表定義時にWITHOUT ROLLBACKオプションを指定した表の行を更新したトランザクションがROLLBACK文やSQL実行中のエラーによりロールバックした場合,取得した番号を使用した業務の表に対してはロールバックされます。この場合,整合性が保たれますが,取得した番号はロールバックされません。このため,ロールバックしたトランザクションで取得した値はHiRDBシステム内で使われずに次の番号が取得され,欠番となります。
(3) 注意
-
データベース作成ユティリティ(pdload)及びデータベース再編成ユティリティ(pdrorg)をログ取得モードを指定して実行した場合,WITHOUT ROLLBACKオプションを指定した表でも,通常の表と同様にロールバックされます。
-
採番業務のように更新処理が集中する表の場合,専用のRDエリア及びグローバルバッファを割り当ててください。
-
システム共通定義pd_idx_without_rollbackにNを指定した場合,WITHOUT ROLLBACKオプションを指定している表にインデクスを定義すると,行更新時にインデクス構成列に対して同値更新となるときだけ行更新ができます。また,行挿入及び行削除時は,行排他は解除されず,通常の表と同様にロールバックされます。
-
表定義時にWITHOUT ROLLBACKオプションを指定した表の行を更新したトランザクションが完了する前にHiRDBシステムが異常終了した場合,HiRDBシステムの再開始後に採番した値が戻るときがあります。採番した値をHiRDBシステム内に閉じて使用する場合,採番した値が戻っても,その値を使用したトランザクションもロールバックするため,HiRDBシステム内で一意性が保てます。HiRDBシステム外で使用する場合は採番した値が戻ると一意性が保てなくなります。HiRDBシステム外で使用する場合は,更新するSQL文にWRITE IMMEDIATEオペランドを指定してください。WRITE IMMEDIATEオペランドを指定すると,HiRDBシステムが異常終了しても値が戻りません。ただし,WRITE IMMEDIATEオペランドを指定すると1行の更新ごとにシステムログの書き出しが行われ,その書き出し時間がSQLの実行時間に加算されます。