J2X0-2268-10Z0(00)
2008年12月
Windows/Solaris/Linux
Symfoware Server
アプリケーション開発ガイド
(
埋込み
SQL
編
)
まえがき
本書の目的
本書は、埋込みSQLを利用したデータ操作のためのプログラムの開発方法について説明します。本書の読者
本書は、Symfoware/RDBのデータベースを利用する方およびSymfoware/RDBのデータベースを処理するアプリケーショ ンを開発する方に読んでいただくように書かれています。本書を読むには、以下に示す技術および知識が必要です。・
Symfoware/RDBの機能およびデータベースの概要を理解している・
Symfoware/RDBを適用する業務について知識をもっている・
C言語またはCOBOL言語でアプリケーションを開発することができる・
Solaris(TM) オペレーティングシステムを使用できる・
Linuxシステムを使用できる・
Windows(R)システムを使用できる参照
グローバルサーバ上のデータベースを利用する場合には、“アプリケーション開発ガイド(埋込みSQL編)グローバルサー バ連携”を参照してください。本書の構成
本書の構成と内容は以下のとおりです。 第1章アプリケーション開発の概要 埋込みSQLを利用したアプリケーション開発の概要を説明します。クライアント・サーバモデルの概要およびアプリケー ション開発作業の流れを説明します。 第2章アプリケーションの設計 埋込みSQLを利用したアプリケーションの設計時に考慮すべき点について説明します。コネクション、文字コード系お よびトランザクションと排他制御について説明します。 第3章アプリケーションの作成 埋込みSQLを利用したアプリケーションの作成方法を、言語別に説明します。C言語およびCOBOL言語のプログラムに SQL文をコーディングする場合の規則、コーディング位置およびSQL文の実行結果の確認の方法について説明しま す。 第4章ルーチンを利用するアプリケーションの作成 プロシジャルーチンおよびファンクションルーチンを利用するアプリケーションの作成方法について説明します。 第5章アプリケーションのコンパイル・リンク 埋込みSQLを利用したC言語またはCOBOL言語のアプリケーションを、コンパイルおよびリンクし、実行可能ファイル を作成する方法について説明します。 第6章アプリケーションの実行 埋込みSQLを利用したC言語またはCOBOL言語のアプリケーションの実行方法および動作環境のチューニング方 法について説明します。 付録A C言語のサンプルプログラム 埋込みSQLを利用したC言語のサンプルプログラムを記載します。付録B COBOL言語のサンプルプログラム 埋込みSQLを利用したCOBOL言語のサンプルプログラムを記載します。 付録C SQLSTATE値 SQL文の実行結果としてアプリケーションに通知されるSQLSTATEについて説明します。 付録D 定量制限 Symfoware/RDBの定量制限の一覧を示します。 付録E システム表 Symfoware/RDBのシステム表で出力される情報の一覧と、その意味について説明します。 付録F 動作環境ファイルのパラメタ一覧 アプリケーションの動作環境をチューニングするために、動作環境ファイルに指定できるパラメタの一覧を示します。 付録G 環境変数 アプリケーションの動作環境をチューニングするための環境変数について説明します。 付録H 資源の見積り ソート作業域およびメモリの見積りについて説明します。 付録I アプリケーションおよびRDBコマンド間の排他 アプリケーションおよびSymfoware/RDBのコマンドが同時に動作した場合の排他制御について説明します。 付録J SQL文の使用範囲 Symfoware/RDBがコンパイル・実行時にサポートするSQL文の使用範囲について説明します。 付録K ファンクションルーチンのパラメタのデータ型と対応するデータ形式 ファンクションルーチンのパラメタに指定されたデータベースのデータ型に対応するデータ形式について説明しま す。
本書の読み方
本書に記載するアプリケーションおよびSQL文の記述の例は、特にことわらない限りC言語での記述を使用します。COBOL の記述と特に異なる点については、“第3章 アプリケーションの作成”で説明します。関連マニュアル
本書に関連するマニュアルは以下のとおりです。・
Sun日本語COBOL使用手引書・
COBOL97使用手引書・
NetCOBOL使用手引書・
COBOL文法書 平成19年 5月 初版 平成19年 6月 第2版 平成19年 8月 第3版 平成19年 11月 第4版 平成19年 12月 第5版 平成20年 1月 第6版 平成20年 4月 第7版 平成20年 5月 第8版 平成20年 9月 第9版 平成20年 12月 第10版目 次
第1章 アプリケーション開発の概要...1 1.1 埋込みSQLの概要...1 1.2 クライアント・サーバモデルの概要...1 1.3 アプリケーション開発作業の流れ...3 第2章 アプリケーションの設計...6 2.1 アプリケーションの設計に必要な概念...6 2.2 セション...7 2.3 トランザクションと排他制御...9 2.3.1 トランザクション制御の概要...10 2.3.2 トランザクション制御の方法...11 2.3.2.1 トランザクションの終了方法...11 2.3.2.2 トランザクションモードの変更...13 2.3.2.3 トランザクションとカーソル操作...18 2.3.3 SQL文の処理結果異常とトランザクション...20 2.3.4 アプリケーションの異常終了とトランザクション...20 2.3.5 排他制御...21 2.3.5.1 排他の属性と選択方法...21 2.3.6 資源の競合が起きた場合の制御...31 2.3.7 行単位の排他を使用する場合の注意事項...33 2.3.8 デッドロックの対処方法...35 2.3.9 トランザクション実行時間の設定...38 2.4 コネクション...38 2.4.1 コネクションの接続方法...39 2.4.2 複数コネクション...41 2.4.2.1 複数コネクションの接続...41 2.4.2.2 現コネクションとSQL文の実行...42 2.4.2.3 現コネクションの変更...43 2.4.2.4 複数コネクションの切断...45 2.4.2.5 複数コネクションでSQL文を実行する場合の注意事項...46 2.4.3 コネクションを意識しないデータ操作の方法...48 2.4.3.1 接続先の指定方法...48 2.4.4 マルチRDB運用のコネクション...49 2.5 文字コード系の考慮...51 2.5.1 文字コード系の決定...51 2.5.2 コード変換の考慮...53 2.5.3 ホスト言語を混在する場合の注意事項...58 2.6 リモートアクセスする場合の注意事項...58 2.6.1 概数を使用するときの注意事項...58 2.6.2 RDB2_TCP接続時の注意事項...58 2.6.3 アプリケーションをUNICODE環境で起動した時の注意事項...61 2.7 マルチスレッド環境におけるデータ操作...61 2.8 名前の一意性と有効範囲...66 2.8.1 埋込みCプログラムの場合...67 2.8.2 埋込みCOBOLプログラムの場合...69 2.9 システムコールを使用する場合の注意事項...72 2.10 SQL文のデータ操作文に関する注意事項...74 2.11 コールバック機能の利用方法...74 第3章 アプリケーションの作成...80 3.1 SQL埋込みCプログラムの作成方法...80 3.1.1 アプリケーションのコーディング規則...80 3.1.2 SQL文の指定位置および指定順序...80 3.1.3 ホスト変数および標識変数の指定方法...83 3.1.4 SQL文の処理結果の確認...873.1.5 日本語文字使用時の注意事項...89 3.1.6 可変長文字列のデータ操作...91 3.1.7 日本語可変長文字列のデータ操作...91 3.1.8 ポインタ変数として宣言したホスト変数の使用方法...91 3.1.9 構造体として宣言したホスト変数の使用方法...95 3.1.10 BLOB型のコンパイル時の展開方法...101 3.1.11 DECIMAL型またはNUMERIC型として宣言したホスト変数のコンパイル時の展開方法...102 3.1.12 拡張SQL文識別子を使用した動的SQL文の実行方法...104 3.1.13 拡張カーソル名を使用したカーソル操作...106 3.2 SQL埋込みCOBOLプログラムの作成方法...108 3.2.1 アプリケーションのコーディング規則...108 3.2.2 SQL文の指定位置および指定順序...109 3.2.3 ホスト変数および標識変数の指定方法...112 3.2.4 SQL文の処理結果の確認...113 3.2.5 可変長文字列のデータ操作...115 3.2.6 BLOB型のコンパイル時の展開方法...116 3.2.7 集団項目ホスト変数の記述方法...116 3.2.8 COBOLプログラム作成時の注意事項...119 3.2.9 クラス定義を使用する場合の注意事項...119 3.2.10 UNICODEを使用する場合のエンディアンの選択...120 3.2.11 拡張SQL文識別子を使用した動的SQL文の実行方法...122 3.2.12 拡張カーソル名を使用したカーソル操作...123 3.3 行識別子の使用時の注意事項...125 3.4 ロール使用時の記述方法...126 3.5 一時表の使用方法...127 第4章 ルーチンを利用するアプリケーションの作成...129 4.1 プロシジャルーチンを利用する場合...129 4.1.1 プロシジャルーチンとは...129 4.1.2 プロシジャルーチンを利用するアプリケーションの作成の流れ...129 4.1.3 プロシジャルーチンの定義...130 4.1.4 プロシジャルーチンの実行...132 4.1.5 プロシジャルーチンの処理結果...135 4.1.6 プロシジャルーチン利用時のトランザクション...137 4.2 ファンクションルーチンを利用する場合...138 4.2.1 ファンクションルーチンとは...138 4.2.2 ファンクションルーチンを利用するアプリケーションの作成の流れ...138 4.2.3 ファンクションルーチンの定義...139 4.2.4 ライブラリの作成...140 4.2.4.1 ライブラリとして登録するCプログラムの作成方法...140 4.2.4.2 ライブラリとして登録するCプログラムのコンパイル・リンク...146 4.2.4.3 ライブラリを作成する場合の注意事項...148 4.2.5 ファンクションルーチンの実行...148 4.2.6 ファンクションルーチンからの異常通知...149 4.2.7 テストドライバの作成および単体テストの実施...152 第5章 アプリケーションのコンパイル・リンク...160 5.1 UNIX系を使用した場合のアプリケーションのコンパイル・リンク...160 5.1.1 アプリケーションのコンパイル・リンクの流れ...160 5.1.2 コンパイル・リンクのための環境設定...160 5.1.3 コンパイル・リンクの方法...164 5.1.4 複数のコンパイル単位から構成されるアプリケーションのコンパイル・リンクの方法...171 5.1.4.1 静的リンクする場合のコンパイル・リンク...171 5.1.4.2 動的リンクする場合のコンパイル・リンク...174 5.1.4.3 動的プログラム構造のコンパイル・リンク...177 5.1.5 コンパイル時のコネクション先の指定...179 5.2 Windows(R)を使用した場合のアプリケーションのコンパイル・リンク...179 5.2.1 アプリケーションのコンパイル・リンクの流れ...179
5.2.2 コンパイル・リンクのための環境設定...180 5.2.3 コンパイル・リンクの方法...183 5.2.4 複数のコンパイル単位から構成されるアプリケーションのコンパイル・リンクの方法...189 5.2.4.1 静的リンクする場合のコンパイル・リンク...189 5.2.4.2 動的リンクする場合のコンパイル・リンク...192 5.2.4.3 動的プログラム構造のコンパイル・リンク...195 5.2.5 コンパイル時のコネクション先の指定...196 第6章 アプリケーションの実行...197 6.1 アプリケーションの実行...197 6.1.1 SERVER_SPECの指定...198 6.1.2 アプリケーションの起動(UNIX系の場合)...198 6.1.3 アプリケーションの起動(Windows(R)の場合)...201 6.2 アプリケーションのデバッグ...204 6.2.1 状態変数およびメッセージ変数の利用方法...204 6.2.2 SQL_SNAP機能の利用方法...205 6.2.3 ROUTINE_SNAP機能の利用方法...208 6.3 最適化情報の更新...211 6.4 アプリケーションのチューニング...218 6.4.1 動作環境ファイルの作成...218 6.4.2 システム用の動作環境ファイルの作成...221 6.4.3 クライアント用の動作環境ファイルの作成...225 6.4.4 サーバ用の動作環境ファイルの作成...253 6.4.5 データ操作範囲の限定方法...256 付録A C言語のサンプルプログラム...258 A.1 可変長文字列のデータ操作例...258 A.2 日本語可変長文字列のデータ操作例...264 A.3 ポインタ型ホスト変数(文字列型)の使用例...270 A.4 ポインタ型ホスト変数(可変長文字列型)の使用例...271 A.5 ポインタ型ホスト変数(BLOB型)の使用例...272 A.6 構造体型ホスト変数の使用例...273 A.7 BLOB型を含む構造体型ホスト変数の使用例...275 A.8 構造体型標識変数の使用例...276 A.9 配列型標識変数の使用例...277 A.10 マルチスレッド環境で動作するアプリケーションの例...279 A.11 コールバック機能の利用例...283 A.12 状態変数およびメッセージ変数の使用例...288 A.13 拡張カーソルを使用したカーソル操作の使用例...290 付録B COBOL言語のサンプルプログラム...293 B.1 可変長文字列のデータ操作例...293 B.2 マルチスレッド環境で動作するアプリケーションの例...295 B.3 集団項目の使用例...297 B.4 状態変数およびメッセージ変数の使用例...298 B.5 拡張カーソルを使用したカーソル操作の使用例...300 付録C SQLSTATE値...303 付録D 定量制限...309 付録E システム表...316 E.1 システム表の概要...316 E.2 システム表の参照...317 E.3 システム表の詳細...321 E.3.1 データベース定義情報...322 E.3.2 スキーマ定義情報...322 E.3.3 表定義情報...323 E.3.4 列定義情報...325
E.3.5 制約定義情報...328 E.3.6 文字列を表現する表情報...329 E.3.7 一意性制約の定義情報...330 E.3.8 列一覧情報...330 E.3.9 注釈情報...332 E.3.10 インデックス情報...333 E.3.11 ルーチン定義情報...333 E.3.12 ルーチンパラメタ情報...335 E.3.13 権限情報...338 E.3.14 トリガ定義情報...341 E.3.15 トリガ列一覧情報...344 E.3.16 順序情報...345 E.3.17 利用者情報...347 E.3.18 ユーザパラメタ設定情報...349 E.3.19 ロール情報...349 E.3.20 ロールに付与された権限の情報...350 E.3.21 利用者に対するロールの付与情報...352 E.3.22 SQL文の簡易実行情報...353 付録F 動作環境ファイルのパラメタ一覧...355 付録G 環境変数...361 付録H 資源の見積り...375 H.1 ソート作業域の見積り...375 H.1.1 共用ソート作業域...375 H.1.2 固有ソート作業域...375 H.2 メモリの見積り式...376 H.2.1 アプリケーション実行時のメモリ見積り...376 付録I アプリケーションおよびRDBコマンド間の排他...377 付録J SQL文の使用範囲...395 付録K ファンクションルーチンのパラメタのデータ型と対応するデータ形式...401 索引...407
第
1
章
アプリケーション開発の概要
Symfoware/RDBには、データベースを作成するための機能、データベースを管理するための機能、およびデータベー スのデータを操作するための機能があります。データベースを作成するためには、まずデータベース構造を設計し、その 設計に基づいてデータベースを定義します。そして、この定義に基づいてデータベースを創成します。データベースの 管理は、データベースの利用状況を調べたり、データベースの破壊に対処したりするために必要です。データベース内 のデータをアクセスするには、SQL文を使用します。 また、Symfoware/RDBは、システム間のネットワークを含めた柔軟なクライアント・サーバシステムを構築するための機能 を提供します。 本章では、以下の項目について説明します。1.1
埋込みSQLの概要
Symfoware/RDBのデータベースの基本的な利用形態として、埋込みSQLを利用したC言語またはCOBOL言語のアプリ ケーションからの利用があります。 業務処理を行うアプリケーションを、プロシジャを利用してサーバで実行させたり、パソコン上でSymfoware Server クライ アント機能のデータベースアクセス機能(Esql)を利用して実行したりすることができます。 この利用形態の概要を以下に示します。図
1.1
埋込み
SQL
を利用したアプリケーションによる
Symfoware/RDB
の利用形態
1.2
クライアント・サーバモデルの概要
ここでは、クライアント・サーバモデルの概要について、以下の順に説明します。・
クライアントとは・
サーバとは・
通信方法・
トランザクション制御・
クライアント・サーバモデルの利用パターンクライアントとは
クライアントとは、データ処理を要求する動作単位のことです。データベースシステムをクライアント・サーバモデルで運用 する場合には、データベースに対してアクセスを要求するアプリケーションは、クライアントとして位置づけられます。サーバとは
サーバとは、データ処理を実行する動作単位のことです。データベースシステムをクライアント・サーバモデルで運用す る場合は、データベース本体が存在する側として位置づけられます。通信方法
クライアントとサーバとの間の通信方法は、クライアントのサーバに対するアクセス方法によって異なります。 ローカルアクセス ローカルのサーバに接続し、データの操作などを行うことを、ローカルアクセスといいます。 リモートアクセス リモートのサーバに接続し、データの操作などを行うことを、リモートアクセスといいます。 通信方法の選択 ローカルアクセスする場合は、自動的にサーバと接続されます。リモートアクセスする場合の通信方法には、以下の2 種類があります。-
性能を重視したRDB2_TCP連携 Symfoware/RDB専用のプロトコルを使用すると、高速にデータベースにリモートアクセスすることができます。-
OSI(Open Systems Interconnection)の汎用プロトコルを使用したRDA-SV連携RDAプロトコルでアクセスするアプリケーションを作成する場合に使用します。 リモートアクセスする場合の通信方法は、クライアント用の動作環境ファイルのSERVER_SPECで指定します。通信方法と SERVER_SPECの指定および接続できるサーバの種類と接続方法について以下に示します。
表
1.1
通信方法と
SERVER_SPEC
の指定について
通信方法 SERVER_SPECの指 定 リモートア クセス 性能を重視したRDB2_TCP連携 RDB2_TCP OSIの汎用プロトコルを使用した RDA-SV連携 RDA表
1.2
接続できるサーバの種類と接続方法について
SERVER _ SPEC接続形態 Windows Solaris Linux グローバル サーバ RDB2_ TCP TCP/IP ○ ○ ○ ○ RDA TCP/IP ○ ○ × ○ ○ : 接続可能 × : 接続不可能
トランザクション制御
データベースの定義、検索および更新に対してデータの整合性を保つためのトランザクション制御機能が、有効に働き ます。そのため、ローカルを含む複数のサーバとの連携時も安全にデータベースへアクセスすることができます。ただし、 1トランザクション内で複数サーバに対するデータベースの同時更新はできません。1つのトランザクション内では1つの サーバの1つのデータベースに対してだけ更新できます。クライアント・サーバモデルの利用パターン
Symfoware/RDB は 、 Solaris 、 Linux 、 Windows(R) 2000 、 Windows(R) XP 、 Windows Server(R) 2003 、 Windows Vista(R)、Windows Server(R) 2008および日本語MS-DOS上のアプリケーションをクライアントとし、Solaris、Linux、 Windows(R) 2000、Windows Server(R) 2003、Windows Server(R) 2008またはグローバルサーバをサーバとして使用す
ることができます。ローカルのデータベースとリモートのデータベースを1つのアプリケーションから同時にアクセスするこ とができます。利用パターンを以下に示します。
図
1.2
クライアント・サーバモデルの利用パターン
1.3
アプリケーション開発作業の流れ
データベースの設計が完了したら、データベースへアクセスするアプリケーションを開発します。アプリケーションの開発 作業の流れを以下に示します。なお、アプリケーションの実行処理を行うためには、Symfoware/RDBの起動が必要とな ります。
図
1.3
アプリケーション開発作業の流れ
アプリケーションの設計
データベースを処理するアプリケーションの設計作業は、一般のアプリケーションの開発作業と変わりません。データベー ス特有に考慮すべき点を以下に示します。 アプリケーションの言語種の選択 データベースを処理するための言語には、C言語およびCOBOL言語があります。アクセス対象の表の列の属性など を考慮して選択する必要があります。 トランザクション データベースは、複数のアプリケーションから共用して利用します。このため、アプリケーション間の排他を考慮して プログラムを設計する必要があります。たとえば、2つのアプリケーションが別の表を参照したあと、互いに他方のアプ リケーションが参照している表を更新するようなプログラムを同時に実行すると、デッドロックが発生して処理ができな くなることがあります。 データ操作のSQL文の選択 アプリケーションで実行するSQL文が決定している場合は、通常のデータ操作のSQL文(動的SQL文以外のSQL文) をアプリケーション中に埋め込んで利用します。アプリケーションの実行中にSQL文を動的に実行する場合は、動的SQL 文をアプリケーション中に埋め込んで利用します。アプリケーションのコーディング
アプリケーションは、ホスト言語のプログラム中にSQL文を埋め込んで記述します。このようなプログラムをSQL埋込みホ ストプログラムと呼びます。ホスト言語には、C言語およびCOBOL言語があります。アプリケーションのコーディング方法 については、“3.1 SQL埋込みCプログラムの作成方法”および“3.2 SQL埋込みCOBOLプログラムの作成方法”で説明し ます。コンパイルおよびリンク
SQL埋込みホストプログラムをコンパイルするためには、利用者依存のコンパイル環境を作成し、この上でコンパイル処 理を行います。 コンパイル環境と、コンパイルおよびリンクの方法については、“5.1 UNIX系を使用した場合のアプリケーションのコンパ イル・リンク”および“5.2 Windows(R)を使用した場合のアプリケーションのコンパイル・リンク”で説明します。アプリケーションの実行
アプリケーションのコンパイルとリンクが完了すると、実際に実行してデバッグを行い、意図した動作が行われることを確 認します。 実行のためには、データ操作のSQL文で指定されている表に対して、表のDSIの定義およびDSIの初期化が完了してい る必要があります。参照
表のDSIの定義およびDSIの初期化については、“RDB運用ガイド(データベース定義編)”を参照してください。
通常は、動作を確認するために必要なデータの創成を完了してから実行します。アプリケーションを実行するための実 行方法については、“第6章 アプリケーションの実行”で説明します。また、アプリケーションのデバッグ方法について は、“6.2 アプリケーションのデバッグ”で説明します。
第
2
章
アプリケーションの設計
本章では、埋込みSQLを利用したアプリケーションの設計時に考慮すべき点を説明します。本章は、アプリケーションの 設計をする場合にお読みください。2.1
アプリケーションの設計に必要な概念
埋込みSQLアプリケーションを利用してデータベースアクセスの設計を行う場合、埋込みSQLに関係する基本的な概念 を理解する必要があります。ここでは、埋込みSQLアプリケーションを利用してデータベースアクセスを行うアプリケーショ ンの設計に必要な概念として、セション、トランザクションおよびコネクションについて説明します。セション
Symfoware/RDBにアクセスする環境をセションと呼びます。 1つのプロセスで1つのセションを実行する場合は、最初のSQL文の実行時にSymfoware/RDBが自動的にセション環境 を作成しています。一般的には、利用者は特にセションを意識する必要はありません。 以下の場合は、セションを意識し、複数作成する必要があります。・
マルチスレッド環境で、データベースアクセスを行う場合・
複数のコネクションで独立してトランザクション操作をしたい場合・
セション単位に、アプリケーションの動作を変更したい場合 アプリケーション内で、セションを操作する関数を呼び出すことで、1つのアプリケーションプロセスで複数のセションを同 時に作成することができます。 詳細については、“2.2 セション”を参照してください。トランザクション
Symfoware/RDBでは、データベースの更新は、データ操作のSQL文の実行ごとに行われるのではなく、トランザクション 制御のSQL文に従って、データベースの更新が行われます。データベースの更新の単位をトランザクションと呼びます。 詳細については、“2.3 トランザクションと排他制御”を参照してください。コネクション
コネクションとは、クライアントのアプリケーションがサーバのSymfoware/RDBデータベースにアクセスするために、クライ アントとサーバの間を結んだ接続関係のことです。アプリケーションがデータベースシステムとコネクションをもつことによっ て、そのデータベースシステムの資源を操作することができます。 詳細については、“2.4 コネクション”を参照してください。 アプリケーションと、セション・トランザクション・コネクションの関係を以下に示します。図
2.1
アプリケーションと、セション・トランザクション・コネクションの関係
1つのアプリケーションプロセスには、1つまたは複数のセションを作成できます。 1つのセションでは、1つまたは複数のトランザクションを実行することができます。ただし、1つのセションで複数のトランザ クションを同時に実行することはできません。 1つのセションから、1つまた複数のコネクションを接続することができます。2.2
セション
ここでは、セションの作成および複数セションについて説明し、セション操作の例を示します。セションの作成
アプリケーションプロセスには、1つまたは複数のセションを作成することができます。 セションを作成する方法には、以下の2つがあります。・
Symfoware/RDBが自動的にセションを作成する・
利用者がセションを操作する関数を呼び出してセションを作成する Symfoware/RDBが自動的にセションを作成する アプリケーションで最初のSQL文が実行されると、Symfoware/RDBが自動的にセションを作成します。 1つのアプリケーションプロセスで1つのセションを利用する場合は、最初のSQL文の実行がセションの開始であり、ア プリケーションの終了がセションの終了となります。 利用者がセションを操作する関数を呼び出してセションを作成する アプリケーション中でセションを操作する関数を呼び出すことにより、セションを作成することができます。複数のセショ ンを作成する要件がある場合は、セションを操作する関数を利用します。 セションを操作する関数を利用する場合は、SQLThrStartID関数の実行がセションの開始であり、SQLThrEndID関数 の実行がセションの終了となります。複数セション
複数セションを作成には、以下の3つがあります。・
マルチスレッド環境で、データベースアクセスを行う場合・
複数のコネクションで独立してトランザクション操作をしたい場合・
セション単位に、アプリケーションの動作を変更したい場合 マルチスレッド環境で、データベースアクセスを行う場合 スレッドごとにセションを割り当てることで、スレッド同士で影響を与えずにデータベースアクセスを実施できます。 マルチスレッド環境で動作するアプリケーションを開発する方法については、“2.7 マルチスレッド環境におけるデー タ操作”を参照してください。 複数のコネクションで独立してトランザクション操作をしたい場合 1つのセションで複数のコネクションを利用する場合、1つのトランザクションで、複数のコネクションに対してデータベー スを更新するSQL文は実行できません。複数のコネクションで、それぞれ更新を並行して実施する場合は、複数のセ ションを作成することで実現できます。 セション単位に、アプリケーションの動作を変更したい場合 ロール、省略時のスキーマ名、利用者、トランザクションモードなどの値は、セション単位に変更できます。1つのアプ リケーションで、これらの変更可能な値が異なる環境を複数利用したい場合は、セションを複数作成し、それぞれの 値を変更することで、実現できます。 複数セションを作成するには、セションを操作する関数を利用します。 セションを操作する関数には、以下の4つがあります。・
SQLThrAllocID関数・
SQLThrStartID関数・
SQLThrEndID関数・
SQLThrFreeID関数参照
各関数の詳細については、“SQLリファレンス”を参照してください。 セションは、セションを操作する関数を使用して、以下の手順で作成します。 (1) SQLThrAllocID関数を発行して、セションを作成します。プロセス内でセションを識別するためのセションIDを受け取 ります。 (2) SQLThrStartID関数を発行して、セションを開始します。これにより、セションと動作スレッドが関係付けられます。 (3) データベースを検索および更新するSQL文を実行します。(4) SQLThrEndID関数を発行して、セションと動作スレッドの関係付けを終了します。 (5) SQLThrFreeID関数を発行して、セションを破棄します。
セション操作の例
以下に、シングルスレッドで複数セションを作成する場合の例を示します。 マルチスレッドの場合の使用方法は、“2.7 マルチスレッド環境におけるデータ操作”を参照してください。 例 SQLHDBS ses_id1; SQLHDBS ses_id2; : int main( void ) {EXEC SQL BEGIN DECLARE SECTION; char SQLSTATE[6]; char SQLMSG[256]; EXEC SQL END DECLARE SECTION;
SQLThrAllocID( &ses_id1 ); SQLThrAllocID( &ses_id2 ); sub01(ses_id1); sub02(ses_id2); sub03(ses_id1); sub03(ses_id2); SQLThrFreeID ( ses_id1 ); SQLThrFreeID ( ses_id2 ); return 0; }
void sub01(SQLHDBS ses_id) { SQLThrStartID( ses_id ); EXEC SQL CONNECT TO 'SV1';
EXEC SQL INSERT INTO SCH.TBL ・・・ ; EXEC SQL COMMIT WORK;
SQLThrEndID ( ses_id ); return 0;
}
void sub02(SQLHDBS ses_id) { SQLThrStartID( ses_id ); EXEC SQL CONNECT TO 'SV2';
EXEC SQL INSERT INTO SCH.TBL ・・・ ; EXEC SQL COMMIT WORK;
SQLThrEndID ( ses_id ); return 0;
}
void sub03(SQLHDBS ses_id) { SQLThrStartID( ses_id ); EXEC SQL DISCONNECT ALL; SQLThrEndID ( ses_id ); return 0; }
2.3
トランザクションと排他制御
Symfoware/RDBでは、トランザクション単位にデータベースの更新が行われます。複数のトランザクションが同時に同じ データベースを参照または更新すると、データの矛盾が発生してしまいます。このようなことを防ぐために、Symfoware/RDB は、排他制御を行います。ここでは、トランザクション処理と排他制御について説明します。2.3.1
トランザクション制御の概要
Symfoware/RDBでは、データベースの更新は、データ操作のSQL文の実行ごとに行われるのではなく、トランザクション 制御のSQL文に従って行われます。データベースの更新の単位をトランザクションと呼びます。 本節では、SQL文を使用してデータ操作を行った場合に、Symfoware/RDBが操作の内容をどのようにデータベースへ 反映するかを説明します。トランザクションの開始
トランザクションは、Symfoware/RDBにより自動的に開始されます。アプリケーション中のSQL文を実行する場合、トラン ザクションが開始された状態でなければ、SQL文の処理に先立ってトランザクションが開始されます。トランザクションが開 始されていない状態とは、アプリケーションが実行開始したあと、またはトランザクション制御用のSQL文によってトランザ クションが終了したあと、SQL文が一度も実行されていない状態です。 SQL文には、トランザクションを開始しないSQL文もあります。・
トランザクションを開始するSQL文-
カーソル宣言以外のデータ操作文-
動的カーソル宣言以外の動的SQL文-
CALL文・
トランザクションを開始しないSQL文-
トランザクション制御文-
コネクション管理文-
セション管理文-
埋込み例外宣言-
カーソル宣言-
動的カーソル宣言-
資源操作文-
SET USER PASSWORD文-
SET ROLE文トランザクションの終了
トランザクションは、以下のSQL文を実行することによって、終了させることができます。また、アプリケーションが正常終了 すると、自動的に終了します。表
2.1
トランザクションを制御する
SQL
文
SQL文 機能 COMMIT 文 現在のトランザクションを終了します。 トランザクション内でのデータ操作(注)をすべてデータベースに反 映します。 オープン中のすべてのカーソルをクローズします。ただし、トランザ クションを超越するカーソルはクローズしません。 トランザクション内で獲得したロックをすべて解放します。 ROLLBAC K文 現在のトランザクションを終了します。 トランザクション内でのデータ操作(注)はすべて取り消します。 オープン中のすべてのカーソルをクローズします。 トランザクション内で獲得したロックをすべて解放します。 注) データ操作には、挿入、更新および削除があります。トランザクションを制御する例
トランザクションを制御する例を以下に示します。データ操作のSQL文を実行すると、トランザクションごとに、そのトランザ クション内で処理されたデータがデータベースに反映されます。図
2.2
データベースの更新処理
2.3.2
トランザクション制御の方法
アプリケーションでは、トランザクションを終了させたり、モードを変更させたりすることができます。ここでは、トランザクショ ンの終了方法と、トランザクションモードの変更方法について説明します。2.3.2.1
トランザクションの終了方法
トランザクションの終了方法には、以下の3つの方法があります。・
COMMIT文によるトランザクションの終了・
ROLLBACK文によるトランザクションの終了・
アプリケーションの終了によるトランザクションの終了COMMIT
文によるトランザクションの終了
COMMIT文は、トランザクションの区切りを指定するSQL文です。COMMIT文により行われる処理は、以下のとおりで す。・
処理中のトランザクションを終了し、このトランザクションで行われたデータ操作をデータベースに反映します。・
オープン中のすべてのカーソルをクローズします。ただし、トランザクションを超越するカーソルはクローズしません。・
このトランザクションで獲得した、データベース資源のロックをすべて解放します。 前に実行したCOMMIT文またはROLLBACK文以後、当該COMMIT文までに行ったデータベースの処理をデータベー スに反映します。次に、現在のトランザクションを終了します。一度もCOMMIT文またはROLLBACK文を実行していな い場合は、アプリケーションの実行開始から当該COMMIT文までのデータベースの処理をデータベースに反映します。 COMMIT文の形式を以下に示します。COMMIT WORK COMMIT文によるデータベース更新の例を以下に示します。
図
2.3 COMMIT
文によるデータベース更新の例
ROLLBACK
文によるトランザクションの終了
ROLLBACK文は、トランザクション内で行ったデータベースの処理を取り消すためのSQL文です。ROLLBACK文により 行われる処理を以下に示します。・
処理中のトランザクションを終了し、このトランザクションで行われたすべての変更を取り消します。データベースは更 新されません。・
オープン中のすべてのカーソルをクローズします。・
このトランザクションで獲得した、データベース資源のロックをすべて解放します。 前に実行したCOMMIT文またはROLLBACK文実行以後、当該ROLLBACK文までに行ったデータベースの処理を取 り消します。そして、現在のトランザクションを終了します。一度もCOMMIT文またはROLLBACK文を実行していない場 合は、アプリケーションの実行開始から当該ROLLBACK文までのデータベースの処理を取り消します。 ROLLBACK文の形式を以下に示します。 ROLLBACK WORK ROLLBACK文によるトランザクション取消しの例を以下に示します。図
2.4 ROLLBACK
文によるトランザクション取消しの例
アプリケーションの終了によるトランザクションの終了
アプリケーションがトランザクション開始状態のままCOMMIT文もROLLBACK文も実行せずに終了する場合には、 Symfoware/RDBがトランザクションをロールバックします。 トランザクションが開始状態のままアプリケーションが終了する例を以下に示します。図
2.5
トランザクション開始状態でのアプリケーションの終了の例
2.3.2.2
トランザクションモードの変更
トランザクションモードの初期値は、動作環境ファイルのDEFAULT_ACCESS_MODEおよびDEFAULT_ISOLATIONで 設定します。また、トランザクションモードの変更は、SET TRANSACTION文で行います。トランザクションモードには、以下の 2つの項目があります。・
トランザクションアクセスモード・
独立性水準トランザクションアクセスモード
トランザクションアクセスモードでは、実行できるSQL文の種類を設定します。トランザクションアクセスモードには、以下の 2種類があります。READ ONLY: 読込み専用モードです。トランザクション内で参照系のSQL文のみ、実行することができます。 READ WRITE: 更新可能モードです。トランザクション内で参照系および更新系のSQL文を実行することができます。 トランザクションアクセスモードの初期値は、動作環境ファイルのDEFAULT_ACCESS_MODEの指定により決まります。
独立性水準
複数のトランザクションが同じ資源にアクセスする場合、なにも制御を行わないと、データの矛盾が発生してしまいます。 独立性水準では、このようなことが起こらないように、あるトランザクションがアクセスしているデータに対し、他のトランザク ションによる参照または更新を制御します。また、他のトランザクションが更新中の資源に対し、自トランザクションが参照 または更新できるかを制御します。 独立性水準には以下の4種類があります。・
SERIALIZABLE・
REPEATABLE READ・
READ COMMITTED・
READ UNCOMMITTED 独立性水準の初期値は、動作環境ファイルのDEFAULT_ISOLATIONの指定により決まります。ただし、動作環境ファ イルのR_LOCKがNOの場合、DEFAULT_ISOLATIONにREPEATABLE_READを指定しても、SERIALIZABLEになり ます。また、動作環境ファイルのR_LOCKがYESの場合は、DEFAULT_ISOLATIONにSERIALIZABLEを指定しても、 REPEATABLE READになります。 独立性水準は、SET TRANSACTION文で変更可能です。ただし、動作環境ファイルのR_LOCKがNOの場合は、SET TRANSACTION文にREPEATABLE READを指定しても、
SERIALIZABLE に な り ま す 。 ま た 、 動 作 環 境 フ ァ イ ル の R_LOCK が YES の 場 合 は 、 SET TRANSACTION 文 に SERIALIZABLEを指定しても、REPEATABLE READになります。 また、動作環境ファイルでDSO_LOCKを指定した場合、SET TRANSACTION文は指定できません。
参照
SET TRANSACTION文の詳細は、“SQLリファレンス”を参照してください。 あるトランザクションの実行中に現れる可能性のある現象を以下に示します。・
現象1) トランザクションT1が行を更新する。T1がトランザクションを終了する前に、トランザクションT2がその行を読み込む。T1 がROLLBACK文を実行した場合、T2は存在しなかった行を読むことになる。・
現象2) トランザクションT1が行を読み込む。トランザクションT2が、その行を更新または削除し、COMMIT文を実行する。T1 がその行を再び読もうとした場合、更新した値を受け取るかまたはその行が削除されたことを知る。・
現象3) トランザクションT1が、ある探索条件を満たす行の集合を読み込む。トランザクションT2が、その探索条件を満たす行 を追加する。T1が、同じ探索条件で再度行の集合を読み込んだ場合、最初とは異なった行の集合を得ることにな る。 独立性水準 現象1) 現象2) 現象3) SERIALIZABLE 不可能 不可能 不可能 REPEATABLE READ 不可能 不可能 可能独立性水準 現象1) 現象2) 現象3) READ COMMITTED 不可能 可能 可能 READ UNCOMMITTED 可能 可能 可能
SERIALIZABLE
あるトランザクションが参照または更新した資源は、そのトランザクションが終了するまで、他のトランザクションから更新さ れないことが保証されます。 動作環境ファイルのパラメタR_LOCKで行単位の排他が指定されていない場合に有効です。 SERIALIZABLEの場合の排他処理を以下に示します。図
2.6 SERIALIZABLE
の場合の排他
(1) 利用者AがCOMMIT(ROLLBACK)終了するまで資源を占有します。 (2) 利用者Bは、利用者Aが資源を占有しているため、待ち状態となります。 (3) 利用者AがCOMMIT(ROLLBACK)するので、利用者Aの資源は解放されます。 (4) 利用者Aが資源を解放したので、利用者Bの更新が実行されます。このとき、資源を占有します。 (5) 利用者BがCOMMIT(ROLLBACK)するので、利用者Bの資源は解放されます。REPEATABLE READ
あるトランザクションが参照または更新した資源は、そのトランザクションが終了するまで、他のトランザクションからの更新 がないことが保証されます。 動作環境ファイルのR_LOCKパラメタで行単位の排他が指定されている場合に有効です。 排他の単位が行単位でかつREPEATABLE READが指定された場合は、該当のトランザクションがアクセスしていない 行は占有しないので、同一トランザクション内で、同一のSQL文をくり返し実行しても、異なる集合が検索される場合があ ります。 REPEATABLE READの場合の排他処理を以下に示します。図
2.7 REPEATABLE READ
の場合の排他
(1) 利用者Aは、COL1がAの行を参照します。トランザクションが終了するまでこの行の集合を占有します。 (2) 利用者Bは、利用者Aが参照した行に対しては更新することができませんが、INSERT文で行を追加することはできま す。 (3) 利用者Aが、再びCOL1がAの行を参照します。このとき前回参照した行に加えて、利用者Bが追加した行も検索され ます。READ COMMITTED
あるトランザクションが更新した資源は、そのトランザクションが終了するまで、他のトランザクションから更新されないこと が保証されます。しかし、以下のいずれかのSQL文で参照した資源に対しては、他のトランザクションから更新される可 能性があります。・
単一行SELECT文・
更新可能性句に、FOR READ ONLYを指定したカーソルのOPEN文・
トランザクションアクセスモードが読込み専用モードのときのOPEN文したがって、同一トランザクション内でも、テーブル参照ごとに内容が異なる場合があります。
図
2.8 READ COMMITTED
の場合の排他
(1) 利用者Aが参照しているため(参照1)、この参照が終了するまで資源を占有します。 (2) 利用者Aが資源を解放するまで、利用者Bは更新を行えず、待ち状態となります。 (3) 利用者Aが参照終了(参照1)し、資源を解放します。 (4) 利用者Aが資源を解放したので、利用者Bの更新が実行されます。このとき、資源を占有します。 (5) 利用者Bが資源を解放するまで利用者Aは更新(更新)を行えず、待ち状態となります。 (6) 利用者Bの更新が終了します。 (7) 利用者Bがトランザクションを終了し、資源を解放します。 (8) 利用者Bが資源を解放したので、利用者Aの更新(更新)が実行されます。このとき、資源を占有します。 (9) 利用者Aが更新終了(更新)しますが、資源の占有は続きます。 (10) 利用者Aが参照(参照2)を行います。このとき検索される行は、利用者Bが更新した行を含みます。 (11) 利用者Aが参照(参照2)を終了しますが、資源の占有は続きます。 (12) 利用者Aがトランザクションを終了します。これによって資源が解放されます。READ UNCOMMITTED
あるトランザクションが参照した資源は、他のトランザクションの参照および更新をまったく制限しません。また他のトラン ザクションが更新した資源も、トランザクションの終了を待たずに参照することができます。トランザクションが更新した資 源は、トランザクション終了まで他のトランザクションの参照および更新を待たせます。 READ UNCOMMITTEDの場合の排他処理を以下に示します。図
2.9 READ UNCOMMITTED
の場合の排他
(1) 利用者Bは、更新処理(更新1)のため、COMMIT(ROLLBACK)終了するまで資源を占有します。 (2) 利用者Aは、資源を占有しないため、利用者Bが資源を占有していても、待ち状態にならずに参照処理(参照1)を行 います。 (3) 利用者Aは利用者Bが資源を解放するまで更新を行えず、待ち状態となります。 (4) 利用者BがCOMMIT(ROLLBACK)します。利用者Bの資源は解放されます。 (5) 利用者Bが資源を解放したので、利用者Aの更新が実行されます。このとき、実際に更新した資源を占有します。 (6) 利用者Aが参照(参照2)を行います。このとき検索される行は、利用者Bが更新した行を含みます。 (7) 利用者Bは利用者Aが資源を解放するまで更新を行えず、待ち状態となります。 (8) 利用者Aが参照(参照2)を終了しますが、資源の占有は続きます。 (9) 利用者AがCOMMIT(ROLLBACK)します。 (10) 利用者Aが資源を解放したので、利用者Bの更新(更新2)が実行されます。このとき、資源を占有します。 (11) 利用者BがCOMMIT(ROLLBACK)します。2.3.2.3
トランザクションとカーソル操作
カーソルは、一般に、トランザクション終了時にクローズされます。しかし、次の場合、カーソルはクローズされません。・
トランザクションの独立性水準指定がREAD COMMITTEDで、カーソル指定の更新可能性句がFOR READ ONLY の場合・
カーソル宣言に、カーソルモード指定がある場合以下に独立性水準指定にREAD COMMITTEDを指定し、更新可能性句にFOR READ ONLYを指定して実現する、ト ランザクションを超越するカーソル操作のSQL文の例を示します。
EXEC SQL DECLARE CSR1 CURSOR FOR ……(1) SELECT * FROM 取引先会社
WHERE 電話番号 LIKE :hcomp_word FOR READ ONLY;
EXEC SQL SET TRANSACTION READ ONLY, ……(2) ISOLATION LEVEL READ COMMITTED;
EXEC SQL OPEN CSR1; ……(3) EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(4) :
EXEC SQL COMMIT WORK; ……(5)
EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(6) :
(データの終了)
EXEC SQL CLOSE CSR1; ……(7)
(1) カーソル“CSR1”を宣言します。更新可能性句に“FOR READ ONLY”を設定します。
(2) トランザクションアクセスモードに“READ ONLY”を設定します。独立性水準に“READ COMMITTED”を設定しま
す。 (3) カーソル“CSR1”をオープンします。 (4) 探索条件が真となる行にカーソルを位置づけ、その行を読み込みます。 (5) COMMITによりトランザクションを終了します。 (6) (5)でカーソルがクローズされないため、カーソルを位置づけることができます。 (7) データ終了後、カーソル“CSR1”をクローズします。 また、以下にカーソルモード指定によって実現する、トランザクションを超越するカーソル操作のSQL文の例を示します。
EXEC SQL DECLARE CSR1 CURSOR FOR ……(1) SELECT * FROM 取引先会社
WHERE 電話番号 LIKE :hcomp_word
WITH OPTION LOCK_MODE(FREE LOCK),CURSOR_MODE(HOLD);
EXEC SQL OPEN CSR1; ……(2)
EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(3) :
EXEC SQL COMMIT WORK; ……(4)
EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(5) : (データの終了) EXEC SQL CLOSE CSR1; ……(6) (1) カーソル“CSR1”を宣言します。カーソルモード指定に“HOLD”を設定します。 (2) カーソル“CSR1”をオープンします。 (3) 探索条件が真となる行にカーソルを位置づけ、その行を読み込みます。 (4) COMMITによりトランザクションを終了します。 (5) (4)でカーソルがクローズされないため、カーソルを位置づけることができます。 (6) データ終了後、カーソル“CSR1”をクローズします。
トランザクションを超越するカーソルを使用する場合の注意事項
トランザクションを超越するカーソルを使用する場合、カーソルのオープン中に、そのカーソルが参照する表の定義や格 納構造定義が変更されると、次のトランザクションでFETCH文の実行が、SQLSTATE値が24000(カーソル不当)のエラー となります。このエラーが発生した場合は、カーソルをクローズして、再度オープンするようにしてください。2.3.3
SQL
文の処理結果異常とトランザクション
データ操作のSQL文の処理中に異常が発生した場合には、アプリケーションにエラーで復帰します。エラーで復帰した ときのトランザクションの状態は、エラーの原因がデッドロックによる場合と、そうでない場合によって異なります。エラーの 原因を示すコードは、状態変数“SQLSTATE”に設定されます。 状態変数“SQLSTATE”に設定される値は、以下のとおりです。 エラー原因がデッドロックの場合のSQLSTATE: 40xxx エラー原因がデッドロック以外の場合SQLSTATE: 40xxx以外デッドロック以外のエラー発生時のトランザクション
エラーが発生したSQL文による更新は、そのSQL文を実行する直前の状態に戻されてアプリケーションへ復帰します。た だし、このSQL文の実行までに獲得されたデータベース資源の占有とカーソルの位置はそのまま保持されます。このと き、トランザクションは継続されたままになっています。トランザクションをそのまま継続させるか終了させるかは、エラーの 原因ごとに利用者がアプリケーションの論理に従って決定します。たとえば、INSERT文で表にデータを繰り返し挿入す るような処理では、あるデータが表の一意性制約に違反するエラーとなっても、そのデータを無視して引き続きデータを 挿入すればよい場合には、トランザクションは継続させて処理を続行します。また、互いに関連のある複数の表を更新す るような処理では、ある表の更新時にエラーが発生した場合、表の間での整合を保つために、ROLLBACK文を実行し てトランザクションをロールバックします。 なお、動作環境ファイルのパラメタ“TRAN_SPEC”の指定により、トランザクションの対処方法を変更することができます。 動作環境ファイルについては、“6.4 アプリケーションのチューニング”を参照してください。 データ操作のSQL文の実行でエラーが発生した場合の例を以下に示します。図
2.10
データ操作の
SQL
文の実行でエラーが発生した場合の例
デッドロックによるエラー発生時のトランザクション
エラーの原因がデッドロックによる場合は、トランザクションはロールバックされてアプリケーションへ復帰します。したがっ て、このSQL文の実行までに獲得されたデータベース資源のロックは解放され、オープン中のカーソルは閉じられます。 デッドロックが発生した場合のアプリケーションの対処方法については、“2.3.8 デッドロックの対処方法”で説明します。2.3.4
アプリケーションの異常終了とトランザクション
アプリケーションは実行中に異常終了することがあります。このとき、トランザクションが開始状態であれば、トランザクショ ンはロールバックされて終了します。アプリケーションが異常終了するケースには以下のような場合があります。・
アプリケーションの実行環境の定義の誤り・
アプリケーションの誤りによる異常終了2.3.5
排他制御
アプリケーションからデータベースへアクセスする場合には、トランザクション単位にSymfoware/RDBで排他制御を行い ます。 データベースの同一資源に対して、アプリケーションおよびRDBコマンドが同時に動作した場合のSymfoware/RDBの排 他制御の詳細については、“付録I アプリケーションおよびRDBコマンド間の排他”を参照してください。2.3.5.1
排他の属性と選択方法
排他の属性には、以下のものがあります。・
占有の資源・
占有の単位・
占有モード・
占有待ちの有無 以下に、排他の属性の指定方法と、排他の属性の各項目の概要を説明します。排他の属性の指定方法
排他の属性を指定するには、以下の方法があります。・
動作環境ファイルの実行パラメタによる指定 動作環境ファイルの実行パラメタによって設定できる属性は、以下のとおりです。 - DSO_LOCK: 資源の占有モードおよび占有単位について指定します。指定されたDSO配下の全DSIに対する占有モードおよ び占有単位となります。 - ISOLATION_WAIT: 占有待ちの有無について指定します。 - R_LOCK: 占有単位について指定します。 - DEFAULT_ACCESS_MODE: トランザクションアクセスモードの初期値を指定します。 DEFAULT_ACCESS_MODE が 指 定 さ れ た 場 合 、 プ ロ セ ス で 最 初 に 実 行 さ れ る SQL 文 の 直 前 で SET TRANSACTION文が実行されたことになります。 - DEFAULT_ISOLATION: 独立性水準の初期値を指定します。 DEFAULT_ISOLATIONが指定された場合、プロセスで最初に実行されるSQL文の直前でSET TRANSACTION 文が実行されたことになります。 各パラメタの記述形式については、“6.4 アプリケーションのチューニング”を参照してください。実行パラメタを省略し た場合は、Symfoware/RDBが選択した属性で排他制御を行います。・
SET TRANSACTION文による指定 アプリケーション中にSET TRANSACTION文の独立性水準指定によって、占有の強さについて設定することができ ます。参照
SET TRANSACTION文の詳細は、“SQLリファレンス”を参照してください。・
Symfoware/RDBによる選択 動作環境ファイルの実行パラメタや、SET TRANSACTION文が指定されなかった場合、Symfoware/RDBがSQL文 を解釈し、その結果をもとに選択します。・
SQL文の占有モード指定による指定 SQL文に占有モード指定をすることにより、SQL文単位に読み込んだデータベース資源(データおよびインデックス) に対して占有モードを設定することができます。この機能を、イルシデーションロックといいます。参照
占有モード指定の詳細は、“SQLリファレンス”を参照してください。ポイント
イルシデーションロック(elucidation lock)とは、占有モード指定により、SQL文単位に読み込んだ資源の占有方法を 決めて、明示的に排他制御を行う機能です。占有の資源
占有する対象の資源は、そのアプリケーションで使用する表のDSIおよびインデックスのDSIです。占有の単位
占有制御によって資源を占有する単位には、行単位、ぺージ単位およびDSI単位があります。 行単位の占有の場合には、アプリケーションがアクセスするデータを含む行が占有の対象になります。ぺージ単位の占 有の場合には、アプリケーションがアクセスするデータを含むぺージが占有の対象になります。DSI単位の占有の場合に は、アプリケーションがアクセスするデータを含むDSIが占有の対象になります。占有単位を指定するには、以下の方法 があります。・
動作環境ファイルの実行パラメタDSO_LOCKおよびR_LOCKでの指定・
Symfoware/RDBによる選択 動作環境ファイルの実行パラメタDSO_LOCKおよびR_LOCKでの指定 占有単位は、動作環境ファイルの実行パラメタDSO_LOCKでDSO単位に指定するかまたは、R_LOCKで指定しま す。 動作環境ファイルの実行パラメタの指定と占有単位について以下に示します。表
2.2
動作環境ファイルの実行パラメタによる占有単位の選択方法
動作環境ファイル の実行パラメタ ページ指定あり ページ指定なし DSO_LOCK 指定したDSOの全DSIを ぺージ単位で占有 指定したDSOの全DSIを DSI単位で占有 R_LOCK 行単位で占有 R_LOCKの値により、DSO_LOCKを指定できない場合があります。以下にDSO_LOCKとR_LOCKの関係を示しま す。表
2.3 DSO_LOCK
と
R_LOCK
の関係
クライアント用の動 作環境ファイルの R_LOCK システム用の動作 環境ファイルの R_LOCK DSO_LOCKの指 定 占有単位 NO NO 指定可 DSO_LOCKの 指定による YES 指定可 DSO_LOCKの 指定による YES NO 指定不可 行単位で占有 (注) YES 指定不可 行単位で占有 (注) 省略 NO 指定可 DSO_LOCKの 指定による YES 指定不可 行単位で占有 (注) 注) DSO_LOCKを指定した場合、CONNECT文実行時にエラーとなります。 Symfoware/RDBによる選択 動作環境ファイルでDSO_LOCKもR_LOCKも指定しなかった場合は、Symfoware/RDBによって占有の単位が選択 されます。 Symfoware/RDBは、SQL文ごとに、そのSQL文でアクセスするデータの範囲(ぺージ数)を算定します。その範囲(ぺー ジ数)の大きさに応じて、以下に示すように占有単位を選択しています。表
2.4 Symfoware/RDB
による占有単位の選択条件
占有単位 選択条件 ページ アクセスするデータの範囲が小さい場合 DSI アクセスするデータの範囲が大きい場合 たとえば、表を全件処理する場合には、表のデータを格納している全DSIに対してDSI単位の占有を選択します。ま た、SQL文の探索条件を解析し、アクセスするぺージが少ないと算定した場合には、ぺージ単位の占有を選択しま す。なお、アクセスするデータの量が少なくても、その範囲(ぺージ数)が大きい場合には、DSI単位の占有を選択しま す。占有モード
データベースにアクセスする場合の占有モードには、共有モードと非共有モードの2種類があります。 共有モードの場合、ロックされたデータは、ほかのトランザクションからのデータ操作において、参照だけが許され更新操 作はできません。一般に、データのロックを獲得中のトランザクションのコミットが行われるまで、ほかのトランザクションの データの更新操作は、待ち状態となります。非共有モードの場合、ロックされたデータは、ほかのトランザクションでデー タ操作することはできません。一般に、データのロックを獲得中のトランザクションのコミットが行われるまで、ほかのトラン ザクションの実行は、待ち状態となります。 占有モードを指定するには、以下の方法があります。・
動作環境ファイルの実行パラメタDSO_LOCKでの指定・
Symfoware/RDBによる選択・
動 作 環 境 フ ァ イ ル の 実 行 パ ラ メ タ DEFAULT_ACCESS_MODE お よ び DEFAULT_ISOLATION 、 ま た は SETTRANSACTION文での指定
動作環境ファイルの実行パラメタDSO_LOCKでの指定 アプリケーションの動作環境ファイルの実行パラメタDSO_LOCKを指定すると、データ操作のSQL文を実行したとき、 データおよびインデックスに対する占有モードを指定することができます。 データに対する占有 データに対する占有モードは、以下に示すように、DSO単位に指定します。