SAVEPOINT (SQL)

SAVEPOINTは、サブトランザクション（入れ子トランザクションとも呼ばれる）を実現するための、データベース言語SQLのステートメントの1つである。トランザクション内の特定の地点に名前を付け、その地点以前に行った処理に影響を及ぼすことなく、その地点以降に行った処理をロールバックできる。1つのトランザクション内で複数の SAVEPOINT を作成することもできる。

SAVEPOINTはデータベースを利用するアプリケーションで、複雑なエラー復帰処理を実現するのに有効である。複数のステートメントから成るトランザクションの途中でエラーが発生した場合、SAVEPOINTを利用すると、トランザクション全体をロールバックすることなく、エラーから復帰することができる。

SAVEPOINT の使用例を以下に示す。SAVEPOINT name で地点に名前を付け、
ROLLBACK TO SAVEPOINT name でロールバックする。設定した SAVEPOINT は RELEASE SAVEPOINT name またはトランザクションの終了時に解放される。

BEGIN;
  INSERT INTO tbl VALUES (1);
SAVEPOINT savepoint_example;
  INSERT INTO tbl VALUES (2);
ROLLBACK TO SAVEPOINT savepoint_example;
  INSERT INTO tbl VALUES (3);
COMMIT;
-- 1 と 3 が挿入された状態になる。

SAVEPOINT は標準SQLにも採用されており、PostgreSQL, Oracle Database, Microsoft SQL Server(SAVE TRAN[SACTION] nameの書式), MySQL, DB2, SQLite (3.6.8 以降), Firebird, Informix Dynamic Server (11.50xC3 以降) など、多くの関係データベース管理システムがサポートしている。

SQL