2.20.2 トランザクションおよびコマンドが実行されるノード
(1) トランザクションが実行されるノード
トランザクションが実行されるノードは,トランザクションアクセスモードとトランザクション隔離性水準の指定によって決まります。次に示す条件をすべて満たすトランザクションは,セカンダリノードまたはワーカーノードで実行されます。
-
トランザクションアクセスモードが読み取り専用モードである
-
トランザクション隔離性水準がREAD COMMITTEDである
ただし,セカンダリノードまたはワーカーノードのスレッド数の空き状況などによっては,上記の条件を満たしていても,プライマリノードでトランザクションが実行されることがあります。プライマリノードのHADBサーバが負荷の少ないノードを選択し,そのノードでトランザクションが実行されます。
- 重要
-
セカンダリノードおよびワーカーノードのリソースを有効に活用するために,検索処理だけを実行するAPは,できる限り次の指定をして実行することを推奨します。
-
トランザクションアクセスモードを読み取り専用モードにする
-
トランザクション隔離性水準をREAD COMMITTEDにする
トランザクションアクセスモードについては,「2.9.5 トランザクションアクセスモード」を参照してください。
トランザクション隔離性水準については,「2.9.2 HADBがサポートしているトランザクション隔離性水準」を参照してください。
-
なお,読み書き可能モードのトランザクションがプライマリノードで実行されている間は,すべてのトランザクションがプライマリノードで実行されます(セカンダリノードまたはワーカーノードではトランザクションが実行されません)。そのため,トランザクションアクセスモードが読み取り専用モードであり,かつトランザクション隔離性水準がREAD COMMITTEDであるトランザクションもプライマリノードで実行されます。したがって,セカンダリノードおよびワーカーノードのリソースを有効に活用するには,読み書き可能モードのトランザクションはできる限り細かい頻度で決着させるようにしてください。
- 重要
-
マルチノード機能を使用している場合,次に示す条件をすべて満たすトランザクションは,カーソルをクローズした際に自動的にトランザクションが正常終了します。
-
トランザクションアクセスモードが読み取り専用モードである
-
トランザクション隔離性水準がREAD COMMITTEDである
複数の文ハンドルで同時にカーソルをオープンしている場合は,オープンしているカーソルがすべてクローズされたときに,自動的にトランザクションが正常終了します。
-
(2) SQL文が実行されるノード
SQL文が実行されるノードを次の表に示します。
項番 |
SQL文の種類 |
SQL文が実行されるノード |
||
---|---|---|---|---|
1 |
定義系SQL |
プライマリノード |
||
2 |
操作系SQL |
更新系SQL |
INSERT文 |
プライマリノード |
3 |
UPDATE文 |
|||
4 |
DELETE文 |
|||
5 |
TRUNCATE TABLE文 |
|||
6 |
PURGE CHUNK文 |
|||
7 |
検索系SQL |
SELECT文 |
プライマリノード,セカンダリノード,またはワーカーノードのどれか |
- ■定義系SQL,TRUNCATE TABLE文,またはPURGE CHUNK文実行時の留意事項
-
セカンダリノードまたはワーカーノードでトランザクションが実行されている間は,定義系SQL,TRUNCATE TABLE文,またはPURGE CHUNK文はすぐに実行されません(WAIT状態になります)。セカンダリノードまたはワーカーノードで実行中のすべてのトランザクションが終了したあとに,定義系SQL,TRUNCATE TABLE文,またはPURGE CHUNK文が実行されます。
また,定義系SQL,TRUNCATE TABLE文,またはPURGE CHUNK文が実行されている間は,すべてのトランザクションがプライマリノードで実行されます(セカンダリノードまたはワーカーノードではトランザクションが実行されません)。
- ■INSERT文,UPDATE文,またはDELETE文実行時の留意事項
-
次に示すどちらかの条件を満たす場合,INSERT文,UPDATE文,またはDELETE文はすぐに実行されません(WAIT状態になります)。
-
INSERT文,UPDATE文,DELETE文の処理対象表が格納されているDBエリアをアクセスするトランザクションが,セカンダリノードまたはワーカーノードで実行されている
-
INSERT文,UPDATE文,DELETE文の処理対象表のインデクスが格納されているDBエリアをアクセスするトランザクションが,セカンダリノードまたはワーカーノードで実行されている
上記のどちらかの条件を満たすトランザクションが終了したあとに,INSERT文,UPDATE文,またはDELETE文が実行されます。
また,INSERT文,UPDATE文,またはDELETE文が実行された場合,セカンダリノードまたはワーカーノードで実行中のSQL文のうち,次のどちらかの条件を満たすSQL文の処理をプライマリノードに切り替えます。
-
INSERT文,UPDATE文,DELETE文の処理対象表が格納されているDBエリアをアクセスするSQL文
-
INSERT文,UPDATE文,DELETE文の処理対象表のインデクスが格納されているDBエリアをアクセスするSQL文
-
- ■検索系SQLがエラーになるケース
-
マルチノード機能を使用している場合は,次のすべての条件を満たす検索系SQLは実行できません。
-
同一トランザクションで,複数の文ハンドルを使用して同時に検索系SQLを実行しようとしている
-
検索系SQLの1つが,データ用DBエリアにアクセスしている最中である
-
更新系SQLがアクセスしているデータ用DBエリアに,2.とは別の検索系SQLがアクセスしようとした(この検索系SQLがエラーになります)
(例)
- [説明]
-
読み書き可能トランザクションであるトランザクションAと,読み取り専用トランザクションであるトランザクションBが同時に実行されているとします。
また,トランザクションBでは,2つの文ハンドルを使用して検索系SQLを同時に実行しようとしています(図中の1.と3.)。
-
表T2への検索系SQLの前処理が,文ハンドル1を使用して実行されています。
-
トランザクションAによって,表T1へのINSERT文が実行されています。
-
2.のINSERT文の実行後(トランザクションAは未決着状態),トランザクションBが文ハンドル2(1.の文ハンドルとは別の文ハンドル)を使用して,表T3への検索系SQLの前処理を実行します。
上記の1.と3.の処理が同時に実行された場合,3.の検索系SQLがエラーになります。このとき,KFAA31898-Eメッセージが出力されます。対処方法については,KFAA31898-Eメッセージで説明されている対処方法に従ってください。
-
-
(3) コマンドを実行できるノード
コマンドを実行できるノードは,コマンドによって異なります。コマンドを実行できるノードについては,マニュアルHADB コマンドリファレンスのマルチノード機能を使用している場合にコマンドを実行できるノードを参照してください。
(4) トランザクションとコマンドの同時実行についての制限
トランザクションと一部のコマンドは同時に実行することはできません。トランザクションとコマンドの同時実行可否を次の表に示します。
項番 |
コマンド名 |
同時実行可否 |
|
---|---|---|---|
1 |
adbarchivechunk |
△ |
|
2 |
adbchgchunkcomment |
△ |
|
3 |
adbchgchunkstatus |
△ |
|
4 |
adbgetcst |
△ |
|
5 |
adbidxrebuild |
△ |
|
6 |
adbimport |
バックグラウンドインポート |
○ |
7 |
上記以外のインポート |
△ |
|
8 |
adbinit |
× |
|
9 |
adbmergechunk |
△ |
|
10 |
adbmodarea |
× |
|
11 |
adbreorgsystemdata |
△ |
|
12 |
adbsql |
○※ |
|
13 |
adbunarchivechunk |
△ |
|
14 |
adbupddmk |
× |
|
15 |
上記以外のコマンド |
○ |
- (凡例)
-
○:ほかのトランザクションと同時に実行できるコマンドです。
△:ほかのトランザクションとの同時実行に制限があるコマンドです。詳細については,このあとで説明している「■トランザクションとの同時実行に制限があるコマンド」を参照してください。
×:ほかのトランザクションと同時に実行できないコマンドです。
- 注※
-
クライアント定義のadb_clt_trn_access_modeオペランドにREAD_ONLYを指定している場合は,セカンダリノードまたはワーカーノードで実行されているほかのトランザクションと同時に実行できます。
- ■トランザクションとの同時実行に制限があるコマンド
-
「表2‒26 トランザクションとコマンドの同時実行可否」の「同時実行可否」欄が△のコマンドについては,次に示す制限があります。
-
△のコマンドが実行されている間は,すべてのトランザクションがプライマリノードで実行されます(セカンダリノードおよびワーカーノードではトランザクションが実行されません)。そのため,トランザクションアクセスモードが読み取り専用モードであり,かつトランザクション隔離性水準がREAD COMMITTEDのトランザクションもプライマリノードで実行されます。
-
セカンダリノードまたはワーカーノードでトランザクションが実行されている間は,△のコマンドはすぐに実行されません(WAIT状態になります)。セカンダリノードまたはワーカーノードで実行中のすべてのトランザクションが終了したあとに,△のコマンドが実行されます。
-