説明
このステートメントは、トランザクション内にセーブポイントを作成し、トランザクションの部分的なロールバックを実現するために使用されます。
構文
セーブポイントの作成:
SAVEPOINT savepoint_name;セーブポイントまでロールバック:
ROLLBACK [WORK] TO [SAVEPOINT] savepoint_name;セーブポイントの削除:
RELEASE SAVEPOINT savepoint_name;
パラメータの説明
パラメータ |
説明 |
|---|---|
| [WORK] | オプションのキーワードです。構文的意味には影響しません。 |
| savepoint_name | セーブポイント名を指定します。指定したセーブポイントはトランザクション内で一意であり、同名のセーブポイントが存在する場合、前のセーブポイントは上書きされます。セーブポイントを作成後、トランザクションを指定したセーブポイントまでロールバックすることができます。また、ROLLBACK ステートメントを使用してトランザクション全体をロールバックすることもできます。 |
例
あるトランザクションが以下のステートメントを実行したと仮定します:
sql_no |
ステートメント |
パーティション |
|---|---|---|
| 1 | UPDATE ...; | p1, p4 |
| SAVEPOINT sp1; | ||
| 2 | UPDATE ...; | p2, p4 |
| 3 | UPDATE ...; | p3, p5 |
| SAVEPOINT sp2; | ||
| 4 | UPDATE ...; | p1, p3, p6 |
| 5 | UPDATE ...; | p1, p5 |
| SAVEPOINT sp3; | ||
| 6 | SELECT ...; | |
| 7 | UPDATE ...; | p5, p6 |
| SAVEPOINT sp4; |
セーブポイントの記録
ユーザーはトランザクションをコミットする前にセーブポイントを作成できます。セーブポイントの作成順序に基づいて、トランザクションのセーブポイントをリンクリストに連結します。上記のトランザクションには7つのSQLと4つのセーブポイントが含まれており、セーブポイントを記録したリンクリストは以下のようになります。各ノードは <savepoint_name, sql_no> のマッピング関係を記録しています。
トランザクション参加者リスト
トランザクションは、特定のSQL以降のすべての変更をロールバックするために、各ステートメントに関連する参加者と対応する sql_no を記録する必要があります。上記のトランザクションは7つのSQLを実行し、p1 から p6 までの合計6つのパーティションに関わります。
Savepointによるロールバックプロセス
セーブポイントリンクリストに基づいて、
savepoint_nameに対応するsql_noを照会します。ユーザーが
ROLLBACK to SAVEPOINT sp2を実行した場合、セーブポイントリンクリストによりsp2に対応するsql_noが3であることが判明します。トランザクション参加者リストに基づいて、
sql_noに対応するパーティションを照会します。トランザクション参加者リストにより、
sql_noが3より大きいステートメントで操作されたパーティションはp1、p3、p5、p6に関わることが判明します。ロールバックパーティションデータ ステップ2 で照会されたパーティションに基づいて、スケジューラーはこれらのパーティションに対してロールバックリクエストを送信し、現在のトランザクションがこれらのパーティション上で
sp2以降に行ったすべての変更をロールバックします。その結果、
p1、p3、p5上の本トランザクションに関する一部の変更がロールバックされ、p6上の本トランザクションに関するすべての変更がロールバックされます。トランザクション参加者リスト情報を更新します。
トランザクション参加者リストを変更し、
sql_noが3より大きい操作情報をトランザクション参加者リストから削除します。p6上のすべての変更がロールバックされたため、p6を参加者リストから削除できます。無効なセーブポイントを削除します。
ユーザーが
ROLLBACK to SAVEPOINT sp2を正常に実行すると、システムはsp3およびsp4のセーブポイントを削除し、sp3およびsp4へのロールバックを許可しなくなります。