Savepointは、OceanBaseデータベースが提供する、ユーザーがトランザクション内で定義可能な実行マーカーです。ユーザーはトランザクション内に複数のマーカーを定義し、必要に応じて指定したマーカーの状態までトランザクションを復元することができます。
例えば、ユーザーが実行中に特定のSavepointを定義した後に誤った操作を行った場合、トランザクション全体をロールバックしてやり直す必要はありません。ROLLBACK TOコマンドを実行することで、そのSavepoint以降の変更をロールバックできます。
以下の表の例では、ユーザーはSavepoint 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シーケンス」があり、この値はトランザクションの実行過程で増分されます(パラレル実行のシナリオは除く)。Savepointを作成する操作は、実際にはユーザーが作成したSavepoint名をトランザクション実行時の現在の「SQLシーケンス」に対応付けるものです。ROLLBACK TOコマンドを実行すると、OceanBaseデータベース内部では以下の操作が実行されます:
トランザクション内で、そのSavepointに対応する「SQLシーケンス」より大きいすべての変更をロールバックし、対応する行ロックを解除します。例えば、例の行2のように。
そのSavepoint以降に作成されたすべてのSavepointを削除します。例えば、例の
sp2のように。
ROLLBACK TOコマンドの実行が成功した後でも、トランザクションは操作を続けることができます。
説明
DBLinkは SAVEPOINT 機能をサポートしており、トランザクションを指定したセーブポイントまでロールバックすることを許可します。DBLinkの詳細については、DBLinkを使用してリモートデータベースのデータを変更するを参照してください。