SAVEPOINT文【SAVEPOINT statement】
概要

トランザクションとは、データベースに対する複数の処理をひとまとまりとして扱う単位である。途中でエラーが発生した場合、通常のROLLBACK文ではトランザクション開始以降のすべての変更が取り消される。長い一連の処理を最初からやり直すのは非効率な場合がある。
そこで事前にSAVEPOINT文で地点を設定しておけば、エラーが起きた際にトランザクションの先頭まで戻らず、ROLLBACK TO SAVEPOINT文によって直前のセーブポイントまでだけを取り消して処理を継続できる。セーブポイント以前の正常な処理結果は保持されたまま、以降の変更のみが破棄される仕組みである。
具体的な構文としては、まずBEGIN文でトランザクションを開始し、いくつかの処理を実行した後に「SAVEPOINT セーブポイント名」で、その時点の状態に名前を付けて保存する。その後、さらに処理を続け、問題が生じた場合には「ROLLBACK TO SAVEPOINT セーブポイント名」で指定した地点まで戻す。最終的に問題がなければCOMMIT文を実行し、トランザクション全体の内容を確定させる。
一つのトランザクションに複数のセーブポイントを設定した場合、新しいセーブポイントを設定した後にそれより前のセーブポイントへ戻ることも可能である。ただし、ROLLBACK TO SAVEPOINTによって指定した地点より後に設定されたセーブポイントは、以後利用できなくなる。設定したセーブポイントが不要になった時点でRELEASE SAVEPOINT文を使い、明示的に削除することもできる。
トランザクション全体が完了あるいは取り消された場合には、その中に設定されていたセーブポイントはすべて消去される。SAVEPOINT文は、MySQLやPostgreSQL、Oracle Database、SQL Serverなど多くのデータベース管理システム(DBMS)で利用できるが、対応状況や構文の細部は製品によって異なる場合がある。SQL Serverではセーブポイントの設定に「SAVE TRANSACTION」という文が使われる。