付録N.1 次の行取り出しで排他を解除する機能
VOSKシステムからマイグレーションするときに必要となる機能です。VOSKシステムからマイグレーションするときだけ,この機能を使用してください。通常はこの機能を使用しないでください。
(1) 概要
次の行取り出しで排他を解除する機能を適用すると,カーソルを使用した検索で,更新のない行の排他を解除します。これによって,更新のなかった行をほかのユーザが参照,更新できるため,トランザクションの同時実行性が向上します。
(2) 前提条件
次の行取り出しで排他を解除する機能は,HiRDB/シングルサーバ限定の機能です。HiRDB/パラレルサーバでは使用できません。
-
HiRDBサーバ以外でUAPを実行する場合,次のPPが必要です。
HiRDB/Run Time Version 6 06-01以降(Windowsの場合はHiRDB/Run Time Version 6 06-00-/B以降)
-
HiRDBサーバ以外でUAPを開発する場合,次のPPが必要です。
HiRDB/Developer's Kit Version 6 06-01以降(Windowsの場合はHiRDB/Developer's Kit Version 6 06-00-/B以降)
-
UAPについては,「注意事項」に記載のすべての注意事項について問題ないことを確認してください。
(3) 指定方法
-
UAP中のSQL文に適用する場合
クライアント環境変数PDISLLVLに12を指定します。
-
ストアドプロシジャ中のSQL文に適用する場合
CREATE PROCEDURE文,ALTER PROCEDURE文,又はALTER ROUTINE文のISOLATION指定で12を指定します。
(4) 機能
SQL文のデータ保証レベルを12に指定します。
データ保証レベルに12を指定すると,カーソルを使用する検索の場合,カーソルが位置づけられている間,排他を保持します。次の行を取り出すとき,又はカーソルを閉じるときに,更新が行われていない一つ前の行の排他を解除します。これによって,カーソルの現在位置の行は,ほかのユーザが更新することを許可しません。さらに,次の行の取り出し,又はカーソルクローズの後,検索済みの更新のない行を,ほかのユーザが更新できます。カーソルを使用しない検索の場合,検索が終了していれば,トランザクションが終了していなくてもほかのユーザからの参照および更新を許可します。
(5) 注意事項
-
データ保証レベルの指定よりも,SQL文中の排他オプションの指定が優先されます。データ保証レベルについては,「データ保証レベル」を参照してください。排他オプションについては,マニュアル「HiRDB SQLリファレンス」の「排他オプション」を参照してください。
-
次の条件に該当する場合は,データ保証レベル2相当の動作になります。
-
配列を使用したFETCH機能を利用する場合
-
-
ブロック転送機能は無効になります
-
この機能の実行中に,作業表を作成するSQL文を実行しても,行の排他が解放されません。そのため,更新のない行でもほかのユーザが更新できません。
なお,UAPがCOBOL85の「RDBファイル入出力機能」又はCOBOL2002の「HiRDBによる索引ファイル入出力機能」を利用する場合,次の条件をすべて満たしているときは作業表を作成しません。
-
インデクスキー値無排他機能を使用している
システム定義でインデクスキー値無排他機能の利用を指定するか,又はシステム定義でインデクスキー値無排他機能を省略すれば,デフォルト設定でインデクスキー値無排他機能が適用されます。
-
クライアント環境変数又はシステム定義で,SQL最適化オプションに「更新SQLの作業表作成抑止機能」を指定している
-
キー項目をクラスタキー定義している,又はインデクスを定義し,最適化情報収集ユティリティ(pdgetcst)によってインデクスシーケンシャル度(SEQ_RATIO)を100としてインデクスの最適化情報を登録している
クラスタキーを定義する場合は,表を横分割していないこと,インデクスを定義する場合は,インデクスを横分割していないことが前提条件となります。インデクスを横分割しないためには,表を横分割しないか,又は表を横分割する場合はキー項目を分割キーにしないようにする必要があります。
-
-
次のどれかの条件を満たしている場合,行の排他又はほかの排他資源が解放されず,ほかのユーザが更新できないことがあります。
-
SQL最適化オプションに「グループ分け高速化処理」を指定し,かつ「グループ分け高速化処理」対象のSQL文を実行する
「グループ分け高速化処理」対象のSQL文については,「グループ分け高速化機能」を参照してください。
-
選択式にCOUNT(*),COUNT(列指定),COUNT_FLOAT(*),COUNT_FLOAT (列指定),SUM(列指定),及びAVG(列指定)だけを指定し,かつGROUP BY句を指定しないSQL文を実行する
-
最小排他資源単位がページ単位に定義されている表(表オプションにLOCK PAGEを指定して定義した表)を検索する
-
LOCK TABLEによって排他を取得した表を検索する
-
BLOB型又は定義長32,001バイト以上のBINARY型の列をユーザ定義関数(システム定義スカラ関数を含む)の引数に指定する
-
プラグイン提供関数を指定する
-
抽象データ型の列又は抽象データ型の列のコンポネント指定を指定する
-
クライアント環境変数PDDBLOGにNOを指定し,FOR UPDATE指定のあるSQLを実行する
-
プラグイン提供関数を使用したSQLを実行する
-
アクセスパスで,表の結合方式がキースキャンマージジョインになるSQLを実行する
-
-
上記4及び5に該当しない場合で,かつGROUP BY句を含むSQLを実行する場合,行取り出し時に次のグループに含まれる一行に対して排他が掛かります。この排他は次の行取り出し時に解除されます。
-
上記4及び5に該当しない場合で,かつGROUP BY句を含ままないで,集合関数又はHAVING句を含むSQLを実行する場合,検索結果の行を取り出した時点で行排他は掛かりません。
-
インデクスキー値排他を適用する場合,カーソルの現在位置の行のインデクスキー値に排他が掛かります。そのため,ほかのトランザクションで同じキー値を持つ行を更新できないことがあります。