セーブポイントとは、OceanBaseデータベースが提供する、ユーザーが定義可能なトランザクション内の実行マーカーです。ユーザーはトランザクション内に複数のマーカーを定義し、必要に応じてトランザクションを指定されたマーカー時点の状態にロールバックさせることができます。
例えば、ユーザーが実行中に特定のセーブポイントを定義した後に誤った操作を行った場合、ユーザーはトランザクション全体をロールバックしてやり直す必要はありません。代わりに、ROLLBACK TO コマンドを実行することで、そのセーブポイント以降の変更をロールバックできます。
以下の表の例では、ユーザーはセーブポイント sp1 を作成して、その後に挿入されたデータをロールバックできます。
| コマンド | 説明 |
|---|---|
BEGIN; |
トランザクションを開始 |
INSERT INTO a VALUES(1); |
行1を挿入 |
SAVEPOINT sp1; |
sp1 という名前のセーブポイントを作成 |
INSERT INTO a VALUES(2); |
行2を挿入 |
SAVEPOINT sp2; |
sp2 という名前のセーブポイントを作成 |
ROLLBACK TO sp1; |
変更を sp1 までロールバック |
INSERT INTO a VALUES(3); |
行3を挿入 |
COMMIT; |
トランザクションをコミット |
OceanBaseデータベースの実装において、トランザクション実行中の変更にはそれぞれ対応する「SQLシーケンス」があり、この値はトランザクション実行中に増加します(パラレル実行の場合は除く)。セーブポイントを作成する操作とは、実際にはユーザーが作成したセーブポイント名をトランザクション実行の現在の「SQLシーケンス」に対応付けることです。ROLLBACK TO コマンドを実行すると、OceanBaseデータベース内部では以下の操作が実行されます:
そのセーブポイントに対応する「SQLシーケンス」より大きい値を持つ、トランザクション内のすべての変更をロールバックし、対応する行ロックを解除します。例えば、例の行2のように。
そのセーブポイント以降に作成されたすべてのセーブポイントを削除します。例えば、例の
sp2のように。
ROLLBACK TO コマンドの実行が成功した後も、トランザクションは引き続き操作を続けることができます。
説明
DBLinkは SAVEPOINT 機能をサポートしており、トランザクションを指定されたセーブポイントまでロールバックすることを許可します。DBLinkに関する詳細情報については、DBLinkを使用してリモートデータベースのデータを変更するを参照してください。