PR

【SQL】SAVEPOINTの意味と使い方を3分で解説

Database

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;

参考 BEGIN/START TRASACTION

このページでは、IT初心者向けにSQLにおけるSAVEPOINT(セーブポイント)の意味と使い方をわかりやすく3分で解説します。

このページで学べる内容
  • SAVEPOINT(セーブポイント)とは?
  • SAVEPOINTの使い方

プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。

参考 【初心者向け】SQLの基本構文ルール

スポンサーリンク

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 単純なトランザクション

多くのデータベース操作は単純であり、1つのトランザクションで完了する場合が多い。そのような場合には、SAVEPOINTのような中間点が必要ないことが一般的。

理由2 アプリケーションレベルでのエラーハンドリング

エラーハンドリングの多くはアプリケーション側(プログラムコード内)で行われます。例外が発生した場合、多くの場合でそのトランザクションを全体としてロールバックするのが一般的なため、あえてデータベース側(SQL)で制御を行う必要性が少ない。

理由3 追加の管理コスト

SAVEPOINTを用いると、その管理(設定、削除、ロールバック)が必要になり、コードが複雑になる可能性がある。

理由4 パフォーマンス

SAVEPOINTが多く設定されると、それに伴うパフォーマンスのオーバーヘッドが発生する可能性がある。

それでもSAVEPOINTが有用なシーンもあります。例えば、大規模なバッチ処理の一部を失敗させたくない場合や、一連の複雑な操作の途中で特定の条件を満たすかチェックして、満たさない場合は一部の操作だけを取り消すような場合には有用です。

状況によっては非常に便利なツールであり、その使い道がある特定のケースでは重要な役割を果たします。

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;

サンプルコードの説明

この例では、sp1sp2という2つのセーブポイントが設定されています。

  • ROLLBACK TO sp1によって、sp1以降に行われた変更(BobとCharlieの挿入)がキャンセルされる。
  • 最終的に、COMMITが実行され、Aliceのデータだけが残る。

SAVEPOINTとCOMMIT

似たような概念に「COMMIT」があります。初心者のうちは、SAVEPOINTと混同しがちですので、この章ではSAVEPOINTとCOMMITの違いについておさらいしておきます。

SAVEPOINTCOMMITは、どちらもトランザクションを制御するSQLのコマンドですが、それぞれ異なる役割があります。

SAVEPOINT

  • SAVEPOINTは、トランザクションの途中で一時的な「セーブポイント」を作成します。
  • もしエラーが起きた場合、ROLLBACK TO [セーブポイント名]でそのセーブポイントまで操作を取り消すことができます。

COMMIT

  • COMMITは、トランザクション内で行われた全ての操作を確定(保存)します。
  • 一度COMMITが実行されると、そのトランザクション内でのROLLBACKSAVEPOINTは無効になります。

つまり、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の挿入)が確定します。

SAVEPOINTCOMMIT前の「一時保存」のようなもので、COMMITが実行されるとその意味はなくなります。これがSAVEPOINTCOMMITの基本的な関係です。

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;

各DBMSには独自の拡張や制限がある場合もありますので、詳しく知りたい方は公式のドキュメントを参照してください。

まとめ: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;

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DatabaseIT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました