SAVEPOINT(セーブポイント)とは、SQLのトランザクション内で特定の状態をマークする(一時保存する)仕組みです。
参考 トランザクションとは?
もしトランザクションの途中で何か問題が起きた場合、そのSAVEPOINTまで戻ってやり直すことができる、知っておくと便利な機能です。
-- トランザクションを開始 BEGIN; -- データを挿入 INSERT INTO users (name, age) VALUES ('Alice', 30); -- セーブポイントを設定 SAVEPOINT sp1; -- さらにデータを挿入 INSERT INTO users (name, age) VALUES ('Bob', 40); -- セーブポイントまでロールバック ROLLBACK TO sp1; -- トランザクションをコミット COMMIT;
このページでは、IT初心者向けにSQLにおけるSAVEPOINT(セーブポイント)の意味と使い方をわかりやすく3分で解説します。
プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。
SAVEPOINTとは?
SAVEPOINT
は、トランザクションの途中で特定の状態を保存する機能。もしトランザクションの途中で何か問題が起きた場合、そのセーブポイントまで戻ってやり直すことが可能になります。
SQLには、複雑なトランザクションを効率的に管理するための多くの機能がありますが、その中でもSAVEPOINT
は、何か問題が発生した場合にその時点までの操作をキャンセルしたいような場合に用いられます。
基本構文
SAVEPOINTを設定する基本的なSQLコマンドは以下の通り。
-- セーブポイントを設定 SAVEPOINT savepoint_name;
SAVEPOINTまでの操作をキャンセルするには、↓のように記述します。
-- セーブポイントまでロールバック ROLLBACK TO savepoint_name;
また、SAVEPOINTが不要になった場合は、次のコマンドで削除します。
-- セーブポイントを削除 RELEASE SAVEPOINT savepoint_name;
コード文自体は非常に簡素ですので、早速具体的な仕様例を確認していきましょう!
以下は、SAVEPOINT「sp1
」までの変更(Aliceのデータ挿入)はそのままで、それ以降の変更(Bobのデータ挿入)は取り消されることを示すサンプルコードです。
-- トランザクションを開始 BEGIN; -- データを挿入 INSERT INTO users (name, age) VALUES ('Alice', 30); -- セーブポイントを設定 SAVEPOINT sp1; -- さらにデータを挿入 INSERT INTO users (name, age) VALUES ('Bob', 40); -- セーブポイントまでロールバック ROLLBACK TO sp1; -- トランザクションをコミット COMMIT;
参考 INSERT文
この例では、セーブポイントsp1
までの変更(Aliceのデータ挿入)はそのままで、それ以降の変更(Bobのデータ挿入)は取り消されます。
このように、トランザクションの状態を一時的に保存(=マーク)し、いつでもその状態を復元することが可能になります。
SAVEPOINTをネストする
「SAVEPOINT
をネストする」というのは、1つのトランザクション内で複数のセーブポイントを設定し、それぞれに独立したロールバックを可能にする手法です。
ネストしたセーブポイントは階層的に管理され、特定のセーブポイントまでロールバックすると、そのセーブポイントより後に設定されたセーブポイントも無効になります。
-- トランザクション開始 BEGIN; -- データを挿入 INSERT INTO users (name, age) VALUES ('Alice', 30); -- 最初のセーブポイントを設定 SAVEPOINT sp1; -- さらにデータを挿入 INSERT INTO users (name, age) VALUES ('Bob', 40); -- 2つ目のセーブポイントを設定 SAVEPOINT sp2; -- さらにデータを挿入 INSERT INTO users (name, age) VALUES ('Charlie', 50); -- 最初のセーブポイントまでロールバック ROLLBACK TO sp1; -- トランザクションをコミット COMMIT;
サンプルコードの説明
この例では、sp1
とsp2
という2つのセーブポイントが設定されています。
ROLLBACK TO sp1
によって、sp1
以降に行われた変更(BobとCharlieの挿入)がキャンセルされる。- 最終的に、
COMMIT
が実行され、Aliceのデータだけが残る。
SAVEPOINTとCOMMIT
似たような概念に「COMMIT」があります。初心者のうちは、SAVEPOINTと混同しがちですので、この章ではSAVEPOINTとCOMMITの違いについておさらいしておきます。
SAVEPOINT
とCOMMIT
は、どちらもトランザクションを制御するSQLのコマンドですが、それぞれ異なる役割があります。
SAVEPOINT
SAVEPOINT
は、トランザクションの途中で一時的な「セーブポイント」を作成します。- もしエラーが起きた場合、
ROLLBACK TO [セーブポイント名]
でそのセーブポイントまで操作を取り消すことができます。
COMMIT
COMMIT
は、トランザクション内で行われた全ての操作を確定(保存)します。- 一度
COMMIT
が実行されると、そのトランザクション内でのROLLBACK
やSAVEPOINT
は無効になります。
つまり、SAVEPOINT
が設定された後でも、COMMIT
が実行されるとそのトランザクションは完了し、セーブポイントは消失します。逆に言えば、COMMIT
を実行する前であれば、任意のSAVEPOINT
まで戻ることができるということです。
以下のコードでその動作を確認していきましょう。
-- トランザクション開始 BEGIN; -- データを挿入 INSERT INTO users (name, age) VALUES ('Alice', 30); -- セーブポイントを設定 SAVEPOINT sp1; -- さらにデータを挿入 INSERT INTO users (name, age) VALUES ('Bob', 40); -- トランザクションをコミット COMMIT;
この例では、SAVEPOINT sp1
を設定していますが、最後にCOMMIT
を実行しているので、そのトランザクション内で行われた全ての変更(AliceとBobの挿入)が確定します。
SAVEPOINT
はCOMMIT
前の「一時保存」のようなもので、COMMIT
が実行されるとその意味はなくなります。これがSAVEPOINT
とCOMMIT
の基本的な関係です。
DBMSごとの違い
データベース管理システム(DBMS)でSAVEPOINT
の書き方が少しだけ異なる場合があります。Oracle, PostgreSQL, MySQL, SQL Serverなど、それぞれのDBMSにおける記載方法を簡単にご説明します。
サンプル PostgreSQL
PostgreSQLでは基本的なSAVEPOINTの操作は標準SQLに従っています。
BEGIN; SAVEPOINT sp1; -- ...操作... ROLLBACK TO sp1; COMMIT;
サンプル MySQL
MySQLも標準SQLに基づいたSAVEPOINTのサポートをしています。
START TRANSACTION; SAVEPOINT sp1; -- ...操作... ROLLBACK TO sp1; COMMIT;
サンプル SQL Server
SQL ServerではSAVEPOINTをサポートしていますが、構文が少し異なります。
BEGIN TRANSACTION; SAVE TRAN sp1; -- ...操作... ROLLBACK TRANSACTION sp1; COMMIT TRANSACTION;
まとめ:SAVEPOINT(セーブポイント)とは?
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。
SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?
とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。