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