説明
このステートメントは、トランザクション内にセーブポイントを作成し、トランザクションの部分的なロールバックを実現するために使用されます。
構文
セーブポイントの作成:
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へのロールバックを許可しなくなります。