分離レベルの指定

分離レベルは、データがアクセスされている間、 データが他のプロセスからどのように分離されるかを決めるものなので、 並行性の要件とデータ保全性の要件のバランスを取る分離レベルを選択する必要があります。

このタスクについて

指定する分離レベルは、作業単位 (UOW) の持続期間中に有効です。 SQL または XQuery ステートメントのコンパイル時に使用される分離レベルを判別するために、以下のヒューリスティックが使用されます。
  • 静的 SQL の場合:
    • ステートメントに isolation-clause が指定されている場合は、その節の値が使用されます。
    • ステートメントに isolation-clause が指定されていない場合は、データベースへのパッケージのバインド時にそのパッケージ用に指定された分離レベルが使用されます。
  • 動的 SQL の場合:
    • ステートメントに isolation-clause が指定されている場合は、その節の値が使用されます。
    • ステートメントに isolation-clause が指定されておらず、SET CURRENT ISOLATION ステートメントが現行セッション内で発行されている場合は、CURRENT ISOLATION 特殊レジスターの値が使用されます。
    • ステートメントに isolation-clause が指定されておらず、SET CURRENT ISOLATION ステートメントが現行セッション内で発行されていない場合は、データベースへのパッケージのバインド時にそのパッケージ用に指定された分離レベルが使用されます。
  • 静的および動的 XQuery ステートメントの場合、環境の分離レベルによって、XQuery 式の評価の際に使用される分離レベルが決まります。
注: 多くの市販のアプリケーションには、分離レベルを選択する方法が用意されています。 詳細については、アプリケーション資料を参照してください。

分離レベルはいくつかの異なった方法で指定することができます。

プロシージャー

  • ステートメント・レベルまたは副選択レベルの場合:
    注: XQuery ステートメントの分離レベルは、ステートメント・レベルでは指定できません。

    WITH 節を使用します。 WITH UR オプションは、読み取り専用の操作にのみ適用されます。 その他の場合には、ステートメントは UR から CS に自動的に変更されます。

    この分離レベルは、ステートメントがあるパッケージに指定された分離レベルをオーバーライドします。 以下の SQL ステートメントの分離レベルを指定することができます。
    • DECLARE CURSOR
    • 検索済み DELETE
    • INSERT
    • SELECT
    • SELECT INTO
    • 検索済み UPDATE
  • 現行セッション内の動的 SQL の場合:

    SET CURRENT ISOLATION ステートメントを使用して、セッション内で発行される動的 SQL のために、分離レベルを設定します。 このステートメントを発行すると、CURRENT ISOLATION 特殊レジスターは、現行セッション内で発行されるすべての動的 SQL の分離レベルを指定する値に設定されます。 いったん設定されると、CURRENT ISOLATION 特殊レジスターにより、どのパッケージがステートメントを発行したかに関係なく、そのセッション内でコンパイルされる後続の動的 SQL ステートメントすべてに、その分離レベルが適用されます。 この分離レベルは、セッションが終了するまで、または SET CURRENT ISOLATION...RESET ステートメントが実行されるまで、有効です。

  • プリコンパイル時またはバインド時:

    サポートされるコンパイル言語で作成されたアプリケーションの場合、PREP または BIND コマンドの ISOLATION オプションを使用します。 sqlaprep または sqlabndx API を使用して、分離レベルを指定することもできます。

    • プリコンパイル時にバインド・ファイルが作成される場合、 分離レベルはそのバインド・ファイル内に保管されます。 バインド時に分離レベルが指定されない場合のデフォルトは、プリコンパイル時に使用された分離レベルです。
    • 分離レベルを指定しない場合、デフォルト・レベルとしてカーソル固定 (CS) が使用されます。
    次の照会を実行すると、 パッケージの分離レベルを調べることができます。
    select isolation from syscat.packages
      where pkgname = 'pkgname'
        and pkgschema = 'pkgschema'
    ここで、pkgname はパッケージの非修飾名、pkgschema はパッケージのスキーマ名です。 これらの名前は、両方とも大文字で指定しなければなりません。
  • 実行時に JDBC または SQLJ で作業する場合:
    注: JDBC および SQLJ は、CLI を使用して Db2® サーバーにインプリメントされます。 これは、 db2cli.ini 設定が、 JDBC および SQLJ を使用して作成および実行される内容に影響する可能性があることを意味します。

    SQLJ でパッケージを作成 (およびその分離レベルを指定) するには、SQLJ プロファイル・カスタマイザー (db2sqljcustomize コマンド) を使用します。

  • 実行時の CLI または ODBC から:

    CHANGE ISOLATION LEVEL コマンドを使用します。 Db2 コール・レベル・インターフェース (CLI) を使用すると、CLI 構成の一部として分離レベルを変更できます。 実行時に、SQLSetConnectAttr 関数を SQL_ATTR_TXN_ISOLATION 属性と共に使用し、ConnectionHandle 引数が参照する現行接続のトランザクション分離レベルを設定してください。 db2cli.ini ファイルで TXNISOLATION キーワードを使用することもできます。

  • REXX をサポートするデータベース・サーバーの場合:

    データベースが作成されると、REXX で SQL のさまざまな分離レベルをサポートする複数のバインド・ファイルがデータベースにバインドされます。 他のコマンド行プロセッサー (CLP) パッケージも、データベースの作成時にデータベースにバインドされます。

    REXX および CLP は、デフォルトの CS 分離レベルを使用してデータベースに接続します。 この分離レベルに変更しても、接続状態は変更されません。

    REXX アプリケーションによって使用されている分離レベルを判別するには、SQLISL 事前定義 REXX 変数の値を確認してください。 この値は、CHANGE ISOLATION LEVEL コマンドを実行するたびに更新されます。

  • 新規セッションに使用されるデフォルトの分離レベルの変更:
    新規セッションで動的 SQL に使用される通常のデフォルトの分離レベルは、そのセッションで使用するパッケージの分離レベルによって決まります。 この値はアプリケーションで処理中に変更することができますが、アプリケーションの外部でデータベース管理者が以下を実行してデフォルトの分離レベルを変更することもできます。