トランザクション内のポイントを指定します。
Synopsis
SAVEPOINT 文は、
トランザクション内のポイントを指定します。これにより、事前に設定されたセーブポイントにトランザクションをロールバックできます。ロールバックは実行されたすべての処理を取り消し、その期間に取得されたロックをすべて解放します。トランザクション内に任意の数のセーブポイントを設定できます。
実行期間の長いトランザクション、または内部制御構造を持つトランザクションでは、その時点で完了しているすべての処理を取り消すのではなく、トランザクションの一部をロールバックできる方が便利な場合が多くあります。セーブポイントを設定すると、トランザクション・レベル・カウンタが増え、そのセーブポイントと識別子が関連付けられます。
COMMIT により、直前のセーブポイントから実行された処理をコミットして、トランザクション・レベルをディクリメントし、セーブポイントを削除します。最後のセーブポイントがコミットされ、トランザクション・レベルがゼロになるまで
COMMIT を発行し続けます。次の
COMMIT により、
START TRANSACTION から実行された処理がコミットされ、トランザクションが終了します。
ROLLBACK TO SAVEPOINT は、最新のセーブポイント以降に実行されたすべての作業をロール・バックし、トランザクション・レベル・カウンタをディクリメントします。すべてのセーブポイントがロール・バックまたはコミットされ、トランザクション・レベル・カウンタがゼロにリセットされると、トランザクションは完了します。
セーブポイントが設定されていなければ、
COMMIT によりトランザクション全体がコミットされ、
ROLLBACK によりトランザクション全体がロールバックされます。
トランザクションの動作が正常完了できなかった場合は、SQLCODE -400 が発行されます。
次の埋め込み SQL の例では、2 つのセーブポイントを持つトランザクションを作成しています。
&sql(START TRANSACTION)
&sql(DELETE FROM Sample.Person WHERE Name=NULL)
IF SQLCODE'=0 {&sql(ROLLBACK)}
ELSE {WRITE !,%ROWCOUNT," bad records deleted"}
&sql(SAVEPOINT svpt_age1)
&sql(DELETE FROM Sample.Person WHERE Age=NULL)
&sql(SAVEPOINT svpt_age2)
&sql(DELETE FROM Sample.Person WHERE Age>65)
&sql(COMMIT)
&sql(COMMIT)
&sql(COMMIT)
Caché ObjectScript と SQL トランザクション
TSTART と
TCOMMIT を使用した Caché ObjectScript トランザクション処理は、SQL 文
START TRANSACTION、
SAVEPOINT、および
COMMIT を使用した SQL トランザクション処理とは異なるもので、互換性もありません。Caché ObjectScript および Caché SQL のいずれも、入れ子構造のトランザクションのサポートに制限があります。Caché ObjectScript トランザクション処理は、SQL ロック制御変数 (特に SQL ロック・エスカレーション変数) と相互にやり取りしません。アプリケーションは、これら 2 種類のトランザクション処理を混同しないよう注意する必要があります。
トランザクションに SQL 更新文が含まれる場合、SQL の
START TRANSACTION 文でトランザクションが開始され、
COMMIT 文でコミットされます。トランザクションを開始するものでない限り、
TSTART/
TCOMMIT を入れ子にして使用するメソッドをトランザクションに組み込むことができます。メソッドとストアド・プロシージャは、通常、設計でトランザクションの主要なコントローラにならない限り、SQL トランザクション制御文を使用しません。ストアド・プロシージャは、独自のトランザクション制御モデルの ODBC/JDBC から呼び出されるため、通常 SQL トランザクション制御文を使用しません。