ユニットを形成するオペレーションのセットを指定します。
トランザクションは、作業のユニットを構成する一連のデータ変更文です。
SET TRANSACTION コマンドを使用して、現在のプロセスのトランザクション・パラメータを設定することができます。
START TRANSACTION コマンドを使用しても、同じパラメータを設定することができます。これらのトランザクション・パラメータは、明示的に変更されるまで複数のトランザクションにわたり有効です。
START TRANSACTION コマンドで、明示的にトランザクションを開始します。このコマンドはオプションです。トランザクション処理が設定されていると、トランザクションは最初のデータベース変更処理で暗黙的に開始されます。
トランザクションが成功したら、
COMMIT 文を使用して、そのデータ変更をデータベースに永久的に追加して、リソースを解放することができます。
トランザクションが失敗した場合、そのデータ修正を元に戻す
ROLLBACK 文を使用して、データベースに反映されないようにします。
トランザクションは、ロックを使用して一意のデータ値を保護します。例えば、処理が一意のデータ値を削除した場合、この値はこのトランザクションの有効期間内はロックされます。したがって、最初のトランザクションが終了するまで、別の処理でこの同じ一意のデータ値を使用して行を挿入することはできません。これは、一意性制約を持つフィールドに結果的に重複値を持たせるロールバックを防ぎます。これらのロックは、
INSERT 文、
UPDATE 文、および
DELETE 文に %NOLOCK 制限引数が含まれる場合を除いて、これらの文によって自動的に適用されます。
Caché SQL トランザクションには、クエリ・キャッシュの作成、変更、または削除は含まれません。したがって、クエリ・キャッシュがトランザクション中に削除された場合、そのトランザクションはロールバックし、クエリ・キャッシュは削除されたままの状態で (リストアされずに) ロールバック・オペレーションになります。
Caché SQL では、完全トランザクション処理とセーブポイントを使用したトランザクション処理の 2 種類のトランザクション処理を実行できます。完全トランザクション処理の場合、トランザクションは
START TRANSACTION 文で (明示的または暗黙的に) 開始され、
COMMIT 文でトランザクションを完了して実行されたすべての処理をコミットするか、
ROLLBACK 文でトランザクション中に実行されたすべての処理を戻すまで、続きます。
-
COMMIT により、直前の
SAVEPOINT から実行されたすべての処理をコミットし、内部トランザクション・レベル・カウンタをディクリメントします。このトランザクション・レベル・カウンタが 0 になった場合のみ、
COMMIT の実行によってトランザクションが終了します。このように セーブポイントを含むトランザクションを完全にコミットするには、複数の
COMMIT 文が必要です。
-
ROLLBACK により、直前の
SAVEPOINT から実行されたすべての処理をロールバックし、内部トランザクション・レベル・カウンタをディクリメントします。このトランザクション・レベル・カウンタが 0 になった場合のみ、
ROLLBACK の実行によってトランザクションが完全に戻ります。このように、セーブポイントを含むトランザクションを完全に戻すには、複数の
ROLLBACK 文が必要です。
-
ROLLBACK saveptname により、
saveptname で指定された
SAVEPOINT から実行されたすべての処理をロールバックし、内部トランザクション・レベル・カウンタを当該のセーブポイント・レベル数だけディクリメントします。例えば、svpt1 と svpt2 という 2 つのセーブポイントを設定して、svpt1 にロールバックする場合、
ROLLBACK により svpt1 から実行された処理を戻し、この場合は、トランザクション・レベル・カウンタを 2 つディクリメントします。
ジャーナル・ファイルに利用できるスペースのほかには、トランザクションで指定できる処理数に制限はありません。Caché には自動ロック制御があるため、通常、ロック・テーブルのサイズが制限を課すことはありません。
既定では、テーブルごとに 1000 ロックのロックしきい値があります。1 つのテーブルは、現在のトランザクションに対して 1000 個の一意データ値ロックを持つことが可能です。1001 番目のロック処理は、トランザクションの有効期間内はロック・テーブルに対してそのテーブル用のロックをエスカレートします。ロック制御のしきい値のサイズは、$SYSTEM.SQL.SetLockThreshold(
integer) 関数呼び出しを使用して、設定できます。この関数は現在のシステム全体の値と構成ファイルの設定の両方を変更します。現在のロック制御のしきい値を確認するには、$SYSTEM.SQL.CurrentSettings() 関数を使用します。
ノード削除処理の結果として削除できるサブノード (子テーブル) 数には制限があります。この制限の既定値は、1000 サブノードの削除です。この制限を超えたサブノード削除はジャーナルされず、したがって、ロールバックできません。この既定の制限は、以下のように変更できます。
[システム管理ポータル] で [構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リストで [Journal] を選択します。
[KillRollbackLimit] の現在の設定を表示および編集します。このオプションを 1000 から 65535 の間のすべての値に設定できます。
既定では、コミットされていないデータへの更新は、その他のユーザから読み取りアクセスで見ることができます。これは、ISOLATION LEVEL READ UNCOMMITTED と同じです。
SET TRANSACTION または
START TRANSACTION で ISOLATION LEVEL READ COMMITTED を指定する場合、コミットされていない更新は見ることができません。その代わり、コミットされていないデータを読み込もうとした場合、ロック待ちになるかタイムアウトになることがあります。