2.10.8 排他制御の例
ここでは,HADBの排他制御の具体例を説明します。
排他制御の仕組みを理解するために,「2.10.3 排他資源」,および「2.10.5 確保される排他資源と排他制御モード」とあわせてお読みください。
- メモ
-
ここで説明する排他制御の例は,サーバ定義のadb_sys_lck_conflict_behaviorオペランドにNOWAITを指定するか,またはオペランドの指定を省略した場合を前提としています。
- 〈この項の構成〉
(1) CREATE TABLE文実行時の排他制御(実表の定義)
CREATE TABLE文を実行すると,次に示す排他資源が確保されます。
-
ディクショナリ(占有モード(EX))
-
前処理表(占有モード(EX))
-
DBエリア
-
データ用DBエリア(占有モード(EX))
-
ディクショナリ用DBエリア(共有参照モード(SR))
-
システム表用DBエリア(共有参照モード(SR))
-
-
表
-
処理対象表(占有モード(EX))
-
ディクショナリ表(占有モード(EX))
-
システム表(コスト情報)(共有参照モード(SR))
-
システム表(チャンク情報)(共有参照モード(SR))
-
ディクショナリの排他が占有モード(EX)で取得されるため,CREATE TABLE文の実行時に後発で実行した定義系SQLは,CREATE TABLE文が完了するまで待ち状態になります。また,ディクショナリ表の排他が占有モード(EX)で取得されるため,CREATE TABLE文の実行時に後発で実行した検索系SQLや更新系SQLも,CREATE TABLE文が完了するまで待ち状態になります。
CREATE TABLE文の実行時に後発で実行した検索系SQL(SELECT文)が待ち状態になる例を次に示します。
- 例1:定義中の実表に対してSELECT文を実行する場合
-
CREATE TABLE T1("ID" INT, "NAME" VARCHAR(100)) in ADBUTBL01 ...1 SELECT * FROM T1 ...2
2のSELECT文は,1のCREATE TABLE文が完了するまで待ち状態になります。
- 例2:定義中の実表とは別の実表に対してSELECT文を実行する場合
-
CREATE TABLE T1("ID" INT, "NAME" VARCHAR(100)) in ADBUTBL01 ...1 SELECT * FROM T2 ...2
注 実表T2は実表T1とは別のデータ用DBエリアに定義されているものとします。
2のSELECT文は,1のCREATE TABLE文が完了するまで待ち状態になります。
また,検索系SQL以外にも,CREATE TABLE文の実行時に後発で実行すると,CREATE TABLE文が完了するまで待ち状態になる操作があります。検索系SQL以外の,後発で実行すると待ち状態になる主な操作を次に示します。
-
INSERT文
-
UPDATE文
-
DELETE文
-
TRUNCATE TABLE文
-
PURGE CHUNK文
-
adbimportコマンド
-
adbdbstatusコマンド
-
adbexportコマンド
-
adbmergechunkコマンド
(2) adbimportコマンド実行時の排他制御(データインポート)
adbimportコマンド実行時の排他制御は,バックグラウンドインポート機能を適用するかどうかで異なります。
(a) バックグラウンドインポート機能を適用する場合の排他制御
バックグラウンドインポート機能を適用したadbimportコマンドを実行すると,データ用DBエリアの排他が保護更新モード(PU)で取得されます。このため,インポート対象表に対する後発の更新操作は,排他資源を確保するときにエラーになります。
バックグラウンドインポート機能を適用したadbimportコマンド実行時に,後発で実行するとエラーになる主な操作※を次に示します。
-
定義系SQL
-
INSERT文
-
UPDATE文
-
DELETE文
-
TRUNCATE TABLE文
-
PURGE CHUNK文
-
adbdbstatusコマンド
ただし,次のどれかの場合はadbdbstatusコマンドを実行できます。
-
DBエリアのサマリ情報を出力する場合
-
--shared-lockオプションを指定して情報を出力する場合
-
再編成要否の情報を出力する場合
-
-
adbmergechunkコマンド
- 注※
-
次のどれかの場合が該当します。
-
SQL文やコマンドの操作対象表が,インポート対象表と同一の場合
-
SQL文やコマンドの操作対象表が,インポート対象表と同じデータ用DBエリアに格納されている場合
-
SQL文やコマンドの操作対象表が,インポート対象表に定義されているインデクスと同じデータ用DBエリアに格納されている場合
-
SQL文やコマンドの操作対象表に定義されているインデクスが,インポート対象表と同じデータ用DBエリアに格納されている場合
-
(b) バックグラウンドインポート機能を適用しない場合の排他制御
バックグラウンドインポート機能を適用しないadbimportコマンドを実行すると,データ用DBエリアおよび処理対象表の排他が占有モード(EX)で取得されます。このため,インポート対象表に対する操作は,排他資源を確保するときにエラーになるか,排他資源を確保できるまで待ち状態になります。
■後発で実行するとエラーになる操作
バックグラウンドインポート機能を適用しないadbimportコマンド実行時に,後発で実行するとエラーになる主な操作※を次に示します。
-
定義系SQL
-
INSERT文
-
UPDATE文
-
DELETE文
-
TRUNCATE TABLE文
-
PURGE CHUNK文
-
adbdbstatusコマンド
ただし,次のどれかの場合はadbdbstatusコマンドを実行できます。
-
DBエリアのサマリ情報を出力する場合
-
--shared-lockオプションを指定して情報を出力する場合
-
再編成要否の情報を出力する場合
-
-
adbmergechunkコマンド
- 注※
-
次のどれかの場合が該当します。
-
SQL文やコマンドの操作対象表が,インポート対象表と同一の場合
-
SQL文やコマンドの操作対象表が,インポート対象表と同じデータ用DBエリアに格納されている場合
-
SQL文やコマンドの操作対象表が,インポート対象表に定義されているインデクスと同じデータ用DBエリアに格納されている場合
-
SQL文やコマンドの操作対象表に定義されているインデクスが,インポート対象表と同じデータ用DBエリアに格納されている場合
-
■後発で実行すると待ち状態になる操作
バックグラウンドインポート機能を適用しないadbimportコマンド実行時に,インポート対象表に対して後発で実行すると待ち状態になる主な操作を次に示します。
-
検索系SQL
-
adbexportコマンド
- メモ
-
インポート対象表以外の表に対する上記の操作は,待ち状態にならないで実行できます(データ用DBエリアの排他は影響しません)。
(3) adbexportコマンド実行時の排他制御(データエクスポート)
adbexportコマンドを実行すると,次に示す排他資源が共有参照モード(SR)で確保されます。
-
シングルコネクション
-
前処理表
-
表
-
処理対象表
-
ディクショナリ表
-
システム表(コスト情報)
-
システム表(チャンク情報)
-
システム表(同義語辞書情報)
-
このため,上記の排他資源を占有モード(EX)で確保する操作以外は,adbexportコマンド実行時,同時に実行できます。上記の排他資源を占有モード(EX)で確保する操作は,排他資源を確保するときにエラーになるか,排他資源を確保できるまで待ち状態になります。
■エクスポート対象表に対して後発で実行するとエラーになる操作
adbexportコマンド実行時に,エクスポート対象表に対して後発で実行するとエラーになる主な操作を次に示します。
-
定義系SQL
-
TRUNCATE TABLE文
-
PURGE CHUNK文
- メモ
-
エクスポート対象表以外の表に対する上記の操作は,エラーにならないで実行できます(データ用DBエリアの排他は影響しません)。
■エクスポート対象表に対して後発で実行すると待ち状態になる操作
adbexportコマンド実行時に,エクスポート対象表に対して後発で実行すると待ち状態になる主な操作を次に示します。
-
バックグラウンドインポート機能を適用しないadbimportコマンド
-
adbmergechunkコマンド(--purge-chunkオプションの指定を省略,または--purge-chunkオプションにWAITを指定した場合)
-
adbreorgsystemdataコマンド(エクスポート対象がシステム表の場合)
- メモ
-
エクスポート対象表以外の表に対する上記の操作は,待ち状態にならないで実行できます(データ用DBエリアの排他は影響しません)。
(4) adbmergechunkコマンド実行時の排他制御(チャンクのマージ)
adbmergechunkコマンドを実行すると,次に示す排他資源が確保されます。
-
シングルコネクション(共有参照モード(SR))
-
前処理表(共有参照モード(SR))
-
DBエリア
-
データ用DBエリア(占有モード(EX))
-
システム表用DBエリア(共有参照モード(SR))
-
-
表
-
処理対象表
--concurrency-priorオプションを指定するかどうかによって排他制御モードが異なります。
-
--concurrency-priorオプションを指定する場合:保護更新モード(PU)
-
--concurrency-priorオプションを指定しない場合:共有更新モード(SU)
-
-
ディクショナリ表(共有参照モード(SR))
-
システム表(コスト情報)(共有参照モード(SR))
-
システム表(チャンク情報)(共有参照モード(SR))
-
このため,次に示す後発の操作は,排他資源を確保するときにエラーになります。
-
マージチャンク対象表と同じDBエリアに格納されている表に対して,排他を取得する後発の操作
-
マージチャンク対象表に対して,保護更新モード(PU),または占有モード(EX)で排他を取得する後発の操作※
-
シングルコネクション,前処理表,ディクショナリ表,またはシステム表に対して,占有モード(EX)で排他を取得する後発の操作
- 注※
-
--concurrency-priorオプションを指定しない場合にエラーになります。--concurrency-priorオプションを指定する場合はエラーになりません。
adbmergechunkコマンド実行時に,後発で実行するとエラーになる主な操作※を次に示します。
-
定義系SQL文
-
INSERT文
-
UPDATE文
-
DELETE文
-
TRUNCATE TABLE文
-
PURGE CHUNK文
-
adbimportコマンド
-
adbdbstatusコマンド
ただし,次のどれかの場合はadbdbstatusコマンドを実行できます。
-
DBエリアのサマリ情報を出力する場合
-
--shared-lockオプションを指定して情報を出力する場合
-
再編成要否の情報を出力する場合
-
- 注※
-
次のどれかの場合が該当します。
-
SQL文やコマンドの操作対象表が,マージチャンク対象表と同一の場合
-
SQL文やコマンドの操作対象表が,マージチャンク対象表と同じデータ用DBエリアに格納されている場合
-
SQL文やコマンドの操作対象表が,マージチャンク対象表に定義されているインデクスと同じデータ用DBエリアに格納されている場合
-
SQL文やコマンドの操作対象表に定義されているインデクスが,マージチャンク対象表と同じデータ用DBエリアに格納されている場合
-
(5) adbdbstatusコマンド実行時の排他制御(データベースの状態解析)
adbdbstatusコマンド実行時の排他制御は,出力する情報によって異なります。
(a) DBエリアのサマリ情報を出力する場合の排他制御
adbdbstatusコマンドでDBエリアのサマリ情報を出力する場合,シングルコネクションおよびディクショナリ表の排他が共有参照モード(SR)で取得されます。このため,ディクショナリ表に対して占有モード(EX)で排他を取得する後発の操作は,排他資源を確保するときにエラーになります。
adbdbstatusコマンド実行時に,後発で実行するとエラーになる主な操作を次に示します。
-
定義系SQL
(b) --shared-lockオプションを指定する場合と再編成要否の情報を出力する場合の排他制御
adbdbstatusコマンドに--shared-lockオプションを指定して情報を出力する場合,またはadbdbstatusコマンドで再編成要否の情報を出力する場合,次に示す排他資源が共有参照モード(SR)で確保されます。
-
シングルコネクション
-
前処理表
-
表
-
処理対象表
-
ディクショナリ表
-
このため,上記の排他資源に対して占有モード(EX)で排他を取得する後発の操作は,排他資源を確保するときにエラーになります。
adbdbstatusコマンド実行時に,後発で実行するとエラーになる主な操作を次に示します。
-
定義系SQL
-
TRUNCATE TABLE文
-
PURGE CHUNK文
-
バックグラウンドインポート機能を適用しないadbimportコマンド
(c) その他の情報を出力する場合の排他制御
「(a) DBエリアのサマリ情報を出力する場合の排他制御」または「(b) --shared-lockオプションを指定する場合と再編成要否の情報を出力する場合の排他制御」以外の場合,次に示す排他資源が確保されます。
-
シングルコネクション(共有参照モード(SR))
-
前処理表(共有参照モード(SR))
-
DBエリア
-
データ用DBエリア(占有モード(EX))
-
ディクショナリ用DBエリア(占有モード(EX))
-
システム表用DBエリア(占有モード(EX))
-
-
表
-
ディクショナリ表(共有参照モード(SR))
-
このため,データ用DBエリア,ディクショナリ用DBエリア,またはシステム表用DBエリアに対して排他を取得する後発の操作は,排他資源を確保するときにエラーになります。また,シングルコネクション,前処理表,またはディクショナリ表に対して占有モード(EX)で排他を取得する後発の操作もエラーになります。
adbdbstatusコマンド実行時に,後発で実行するとエラーになる主な操作を次に示します。
-
定義系SQL
-
INSERT文
-
UPDATE文
-
DELETE文
-
TRUNCATE TABLE文
-
PURGE CHUNK文
-
adbimportコマンド
-
adbmergechunkコマンド
(6) adbmodareaコマンド実行時の排他制御(DBエリアの追加・変更)
adbmodareaコマンドを実行すると,シングルコネクションの排他が占有モード(EX)で取得されます。このため,adbmodareaコマンド実行時,シングルコネクションの排他を取得する操作(HADBサーバに接続する操作)を実行すると,すべてエラーになります。
adbmodareaコマンド実行時に,後発で実行するとエラーになる主な操作を次に示します。
-
定義系SQL※
-
検索系SQL※
-
INSERT文※
-
UPDATE文※
-
DELETE文※
-
TRUNCATE TABLE文※
-
PURGE CHUNK文※
-
adbimportコマンド
-
adbdbstatusコマンド
-
adbexportコマンド
-
adbmergechunkコマンド
- 注※
-
APがHADBサーバに接続する際にエラーになるため,SQL文を実行できません。
(7) adblsコマンド実行時の排他制御(HADBサーバの状態表示)
adblsコマンドは排他資源を確保しません。このため,排他資源を確保するほかの操作と同時に実行できます。