データベースの変更
SQL を使用して、データベースの内容を変更できます。テーブルにインデックスが定義されている場合は、SQL は変更を自動的に更新します。データや参照整合の制約が定義されている場合は、SQL は自動的にそれらを実行します。定義されたトリガがある場合、これらのアクションを実行すると、対応するトリガがプルされます。
以下の項目について説明します。
INSERT 文
INSERT 文は、SQL テーブルに新規の行を挿入します。
INSERT INTO MyApp.Product
(Name,SKU,Price)
VALUES ('Ginsu','DPV1486',22.95)
INSERT OR UPDATE 文を発行することもできます。この文は、その行がまだ存在していない場合に、SQL テーブルに新規の行を挿入します。その行が存在する場合は、この文は、提供されたフィールド値でその行データを更新します。
UPDATE 文
UPDATE 文は、SQL テーブルの既存の 1 行以上の行の値を変更します。
UPDATE MyApp.Person
SET HairColor = 'Red'
WHERE %ID = 435
DELETE 文
DELETE 文は、SQL テーブルから既存の 1 行以上の行を削除します。
DELETE FROM MyApp.Person
WHERE HairColor = 'Aqua'
TRUNCATE TABLE コマンドを発行して、テーブルからすべての行を削除することもできます。DELETE を使用して、テーブルからすべての行を削除することもできます。DELETE (既定) は削除トリガをプルします。一方、TRUNCATE TABLE は削除トリガをプルしません。DELETE を使用してすべての行を削除しても、テーブル・カウンタはリセットされません。一方、TRUNCATE TABLE ではカウンタはリセットされます。
トランザクション処理
トランザクションは、1 つの作業単位を構成する一連のデータ変更文 (INSERT、UPDATE、DELETE、INSERT OR UPDATE、および TRUNCATE TABLE) です。
SET TRANSACTION コマンドを使用して、現在のプロセスのトランザクション・パラメータを設定することができます。START TRANSACTION コマンドを使用しても、同じパラメータを設定することができます。これらのトランザクション・パラメータは、明示的に変更されるまで複数のトランザクションにわたり有効です。
START TRANSACTION コマンドで、明示的にトランザクションを開始します。一般的に、このコマンドはオプションです。トランザクションの %COMMITMODE が IMPLICIT または EXPLICIT の場合は、トランザクションは最初のデータベース変更処理で自動的に開始されます。トランザクションの %COMMITMODE が NONE の場合は、START TRANSACTION を明示的に指定してトランザクション・プロセスを開始する必要があります。
トランザクションが成功したら、変更を暗黙的 (自動的) または明示的にコミットできます。COMMIT 文を使用してそのデータ変更をデータベースに永久的に追加して、リソースを解放する必要があるかどうかは、%COMMITMODE の値で決定します。
トランザクションが失敗した場合、そのデータ修正を元に戻す ROLLBACK 文を使用して、データベースに反映されないようにします。
SQL が管理ポータルの [SQLクエリ実行] インタフェースを使用して実行されている場合、SQL のトランザクション文はサポートされません。このインタフェースは SQL コードを開発するときのテスト環境として使用することを意図したもので、実際のデータを変更するためのものではありません。
トランザクションとセーブポイント
Caché SQL では、完全トランザクション処理とセーブポイントを使用したトランザクション処理の 2 種類のトランザクション処理を実行できます。完全トランザクション処理の場合、トランザクションは START TRANSACTION 文で (明示的または暗黙的に) 開始され、COMMIT 文でトランザクションを (明示的または暗黙的に) 完了して実行されたすべての処理をコミットするか、ROLLBACK 文でトランザクション中に実行されたすべての処理を戻すまで、続きます。
セーブポイントを使用する場合、Caché SQL はトランザクション内でレベルをサポートします。START TRANSACTION 文で、(明示的にまたは暗黙的に) トランザクションを開始します。トランザクション内で SAVEPOINT を指定して、プログラム内の 1 つ以上の名前付きセーブポイントを指定します。1 つのトランザクションに最大 255 個までの名前付きセーブポイントを指定できます。セーブポイントを追加すると、$TLEVEL トランザクション・レベル・カウンタがインクリメントされます。
-
COMMIT は、トランザクションの間に実行されたすべての作業をコミットします。セーブポイントは無視されます。
-
ROLLBACK は、トランザクションの間に実行されたすべての作業をロールバックします。セーブポイントは無視されます。
-
ROLLBACK TO SAVEPOINT pointname により、pointname で指定された SAVEPOINT から実行されたすべての処理をロールバックし、内部トランザクション・レベル・カウンタを当該のセーブポイント・レベル数だけデクリメントします。例えば、svpt1 と svpt2 という 2 つのセーブポイントを設定して、svpt1 にロールバックする場合、ROLLBACK TO SAVEPOINT svpt1 により svpt1 から実行された処理を戻し、この場合は、トランザクション・レベル・カウンタを 2 つデクリメントします。
非トランザクション操作
トランザクションが有効な間でも、以下の操作はトランザクションに含まれないのでロールバックできません。
-
IDKey カウンタのインクリメントは、トランザクション操作ではありません。IDKey は $INCREMENT (または $SEQUENCE) によって自動的に生成されます。そこでは SQL トランザクションとは別にカウントを保持しています。例えば、IDKeys が 17、18、および 19 の行を挿入し、この挿入をロールバックすると、挿入される次の行の IdKey は 20 になります。
-
クエリ・キャッシュの作成、変更、削除は、トランザクション操作ではありません。したがって、クエリ・キャッシュがトランザクション中に削除された場合、そのトランザクションはロールバックし、クエリ・キャッシュは削除されたままの状態で (リストアされずに) ロールバック・オペレーションになります。
-
トランザクション中に発生する DDL 操作やテーブル・チューニング操作は、一時ルーチンを作成したり実行する場合があります。この一時ルーチンは、クエリ・キャッシュと同様に処理されます。つまり、一時ルーチンの作成、コンパイル、および削除はトランザクションの一部として処理されません。一時ルーチンの実行は、トランザクションの一部であると見なされます。
ロールバックされるまたはロールバックされない非 SQL 項目については、ObjectScript の "TROLLBACK" コマンドを参照してください。
トランザクションでのロック
トランザクションは、ロックを使用して一意のデータ値を保護します。例えば、処理が一意のデータ値を削除した場合、この値はこのトランザクションの有効期間内はロックされます。したがって、最初のトランザクションが終了するまで、別の処理でこの同じ一意のデータ値を使用して行を挿入することはできません。これは、一意性制約を持つフィールドに結果的に重複値を持たせるロールバックを防ぎます。これらのロックは、INSERT 文、UPDATE 文、INSERT OR UPDATE 文、および DELETE 文に %NOLOCK 制限引数が含まれている場合を除き、これらの文によって自動的に適用されます。
トランザクション・サイズの制限
ジャーナル・ファイルに利用できるスペースのほかには、トランザクションで指定できる処理数に制限はありません。Caché には自動ロック制御があるため、通常、ロック・テーブルのサイズが制限を課すことはありません。
既定では、テーブルごとに 1000 ロックのロックしきい値があります。1 つのテーブルは、現在のトランザクションに対して 1,000 個の一意データ値ロックを持つことが可能です。1,001 番目のロック処理は、トランザクションの有効期間内はロック・テーブルに対してそのテーブル用のロックをエスカレートします。
このロックしきい値は、以下のいずれかの方法で変更できます。
-
$SYSTEM.SQL.SetLockThreshold()Opens in a new tab メソッドを呼び出します。このメソッドは、現在のシステム全体の値と構成ファイルの設定の両方を変更します。現在のロック制御のしきい値を確認するには、$SYSTEM.SQL.GetLockThreshold()Opens in a new tab メソッドを使用します。
-
管理ポータルに移動します。[システム管理] から、[構成]、[SQL およびオブジェクトの設定]、[一般SQL設定] (システム, 構成, 一般SQL設定) を選択します。この画面で、[ロックしきい値] の現在の設定を表示および編集できます。
強制終了できるサブノード (子テーブル) の数に制限はありません。すべてのサブノードの強制終了はジャーナルに記録されるので、ロールバックできます。そのため、従来のバージョンの Caché に適用されていたサブノードの強制終了数の制限はなくなりました。
コミットされていないデータの表示
クエリ発行のプロセスに対して SET TRANSACTION または START TRANSACTION を設定することで、読み取り分離レベルを指定できます。
-
ISOLATION LEVEL READ UNCOMMITTED: データに対するコミットされていない挿入、更新、および削除は、別のユーザによるクエリ (読み取りのみ) アクセスで表示できます。トランザクションが指定されていない場合は、これが既定になります。
-
ISOLATION LEVEL READ VERIFIED: データに対するコミットされていない挿入、更新、および削除は、別のユーザによるクエリ (読み取りのみ) アクセスで表示できます。クエリ条件で使用されるデータとクエリで表示されるデータを再チェックできます。
-
ISOLATION LEVEL READ COMMITTED: コミットされていない挿入および更新によるデータへの変更は、クエリ結果セットには表示されません。クエリ結果セットには、コミット済みの挿入および更新のみが含まれます。ただし、コミットされていない削除によるデータへの変更は、クエリ結果セットに表示されます。
SELECT コマンド節である、集約関数、DISTINCT 節、GROUP BY 節、または %NOLOCK キーワードを指定した SELECT は、現在の分離レベルに関係なく、コミットされていないデータを必ず返します。詳細は、"分離レベル" を参照してください。
ObjectScript トランザクション・コマンド
ObjectScript と SQL のトランザクション・コマンドは完全に互換性があり、置き換え可能ですが、以下の例外があります。
ObjectScript TSTART と SQL START TRANSACTION はどちらも、トランザクションが進行中でない場合にトランザクションを開始します。ただし、START TRANSACTION では、入れ子になったトランザクションはサポートされません。そのため、入れ子になったトランザクションが必要な場合 (または必要になる可能性がある場合) には、トランザクションを TSTART で始めることをお勧めします。SQL 標準との互換性が必要な場合は、START TRANSACTION を使用してください。
ObjectScript トランザクション処理は、入れ子になったトランザクションを限定的にサポートします。SQL トランザクション処理はトランザクション内のセーブポイントをサポートします。