【せーぶぽいんと】

セーブポイント とは?

💡 ゲームのセーブと同じ!失敗したらここからやり直し
📌 このページのポイント
セーブポイントの仕組み BEGIN INSERT 1 SP-A INSERT 2 SP-B INSERT 3 エラー! ROLLBACK TO SP-B 再INSERT COMMIT 全体をロールバックせず、セーブポイントまで部分的に戻せる
セーブポイントのイメージ
ひよこ ひよこ

セーブポイントって、RPGのセーブみたいなもの?

ペンギン先生 ペンギン先生

まさにそのイメージ!トランザクションの途中に「ここまではOK」っていう目印を置いておけるんだ。失敗したらその地点まで戻ってやり直せるよ

ひよこ ひよこ

普通のロールバックと何が違うの?

ペンギン先生 ペンギン先生

普通のROLLBACKはトランザクション全体を最初まで巻き戻すけど、ROLLBACK TO SAVEPOINTはセーブポイントの位置まで部分的に戻せるんだ。100件中50件目でエラーが出ても、セーブポイントから再開できるよ

ひよこ ひよこ

セーブポイントは何個でも置けるの?

ペンギン先生 ペンギン先生

何個でも置けるよ。名前を付けて管理するんだ。たとえば `SAVEPOINT step1` `SAVEPOINT step2` みたいに段階的に設定して、任意の段階まで戻れるよ

ひよこ ひよこ

どんなときに使うと便利なのかな?

ペンギン先生 ペンギン先生

バッチ処理で大量のデータを1トランザクションで処理するとき、途中でエラーが出ても最初からやり直さなくていいから重宝するよ。あとはストアドプロシージャエラーハンドリングで「この処理が失敗したらここまで戻す」って書くのにも使うね

ひよこ ひよこ

使うときの注意点はある?

ペンギン先生 ペンギン先生

セーブポイントを大量に作るとメモリを消費するから注意が必要だよ。あと、RELEASE SAVEPOINTで不要になったセーブポイントを解放するのも大事だね。PostgreSQLではサブトランザクションとして実装されていて、大量のセーブポイントはロック管理のオーバーヘッドが増えるから、本番環境では慎重に使おうね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「セーブポイント」って出てきたら「トランザクションの途中に中間セーブを置いて部分的にやり直せる仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Savepoint」 = 保存地点
💬 ゲームのセーブポイントと同じ発想で、途中の状態を保存しておく地点のことだよ
← 用語集にもどる