分離レベル

SQL ステートメントの実行中に使用する分離レベル によって、活動化グループが並行して実行される他の活動化グループから分離される度合いが決定されます。

したがって、活動化グループ P が SQL ステートメントを実行すると、分離レベルによって次のことが決定されます。

  • P によって検索される行、および P によって行われるデータベースの変更が、並行して実行される他の活動化グループで使用できる度合い。
  • 並行して実行される活動化グループによって行われるデータベースの変更が、P に影響を及ぼす度合い。

分離レベルは、DELETE、INSERT、SELECT INTO、UPDATE、 または選択ステートメントに対して明示的に指定できます。 分離レベルを明示的に指定しない場合、 SQL ステートメントを実行したときには デフォルト分離レベル という分離レベルが使用されます。

Db2® for i では、デフォルト分離レベル を指定するために、いくつかの方法を提供しています。
表 1. デフォルトの分離レベル・インターフェース
SQL インターフェース 指定
組み込み SQL 「SQL プログラム作成」(CRTSQLxxx) コマンドの COMMIT パラメーター。 SET OPTION ステートメントを使用して、COMMIT 値を設定することもできます。 (CRTSQLxxx コマンドについて詳しくは、「組み込み SQL プログラミング」を参照してください。)
SQL 関数と SQL プロシージャー SQL 関数と SQL プロシージャーに組み込んだ静的 SQL ステートメントは、その SQL 関数または SQL プロシージャーの作成時に有効だった分離レベルを使用します。SET OPTION ステートメント (COMMIT) を使用して分離レベルを設定することもできます。
SQL ステートメント実行 「SQL ステートメントの実行」(RUNSQLSTM) コマンドの COMMIT パラメーター。 (RUNSQLSTM コマンドの詳細については、 「SQL プログラミング」を参照。)
SET TRANSACTION SQL ステートメント 作業単位内でデフォルトの分離レベルをオーバーライドします。その作業単位が終了すると、分離レベルはその作業単位の開始時点での値に戻ります。 このステートメントは、その作業単位内の静的および動的 SQL ステートメントに関する分離レベルの他の指定もすべてオーバーライドします。 (SET TRANSACTION ステートメントについて詳しくは、SET TRANSACTIONを参照してください。)
isolation-clause SELECT、SELECT INTO、INSERT、UPDATE、 DELETE、および DECLARE CURSOR ステートメントの isolation-clause は、特定のステートメントまたはカーソルについてデフォルトの分離レベルをオーバーライドします。 分離レベルが有効なのは、isolation-clause を含むステートメントを実行する場合のみであり、現行の作業単位内で保留中の変更に対しては無効です。 (isolation-clause について詳しくは、ISOLATION 文節を参照してください。)
サーバー上の呼び出しレベル・インターフェース (CLI) SQL_ATTR_COMMIT または SQL_TXN_ISOLATION 環境変数または接続オプション (CLI について詳しくは、「SQL 呼び出しレベル・インターフェース (ODBC)」を参照してください。)
IBM® IBM Developer Kit for Java™ を使用したサーバーの JDBC または SQLJ トランザクション分離プロパティー・オブジェクト (JDBC および SQLJ について詳しくは、「IBM Developer Kit for Java」を参照してください。)
IBM i Access Family ODBC ドライバーを使用したクライアントの ODBC ODBC セットアップでのコミット・モード (ODBC の詳細については、「IBM i Access」を参照。)
IBM Toolbox for Java を使用したクライアントの JDBC JDBC セットアップでの分離レベル (JDBC の詳細については、「IBM i Access」を参照。) (IBM Toolbox for Java について詳しくは、「IBM Toolbox for Java」を参照してください。)
IBM i Access Family OLE DB Provider を使用したクライアントの OLE DB IsolationLevel 接続オブジェクト・プロパティー (OLE DB の詳細については、「IBM i Access」を参照。)
IBM i Access FamilyADO .NET プロバイダーを使用しているクライアントの ADO .NET 接続オブジェクト・プロパティー内の IsolationLevel (ADO .NET の詳細については、「IBM i Access」を参照。)

これらの分離レベルは、該当するデータを自動的にロックすることによってサポートされます。ロックのタイプに応じて、異なるコミットメント定義を使用して、並行して実行される活動化グループによるデータのアクセスが制約、または禁止されます。それぞれのデータベース・マネージャーでは、少なくとも次に示す 2 つのロックのタイプをサポートしています。

共用
異なるコミットメント定義を使用する、並行して実行される活動化グループを、データに対する読み取り専用操作に限定します。
排他
異なるコミットメント定義を使用する、並行して実行される活動化グループによるデータの更新および削除を防止します。並行して実行される活動化グループが、COMMIT(*RS)、COMMIT(*CS)、または COMMIT(*RR) を実行している異なるコミットメント定義を使用する場合は、それによるデータの読み取りを防止します。並行して実行される活動化グループが、COMMIT(*UR) または COMMIT(*NC) を実行している異なるコミットメント定義を使用する場合は、それによるデータの読み取りを許します。

分離レベルに関する以下の説明は、行単位で行われるデータのロックについて述べています。個々のインプリメンテーションでは、基本表の行よりも大きな物理単位でデータをロックすることができる場合があります。ただし、論理的には、ロックはすべての製品において基本表の行レベルで行われます。 同様に、データベース・マネージャーでは、ロックをより上位のレベルにまで拡大することができます。 活動化グループには、少なくとも要求される最低限のロック・レベルが保証されます。

レコード・ロック期間について詳しくは、「SQL プログラミング」トピック集にあるトピックコミットメント制御の説明および表を参照してください。

Db2 for i では、5 つの分離レベルをサポートします。コミット不可以外のすべての分離レベルで、データベース・マネージャーは、挿入、更新、または削除されるすべての行に排他ロックします。これにより、ある作業単位の過程で変更された行は、その作業単位が完了するまで、異なるコミットメント定義を使用する他の活動化グループにより変更されることはありません。