【せーぶぽいんと】

セーブポイント とは?

公開:
💡 ゲームのセーブと同じ!失敗したらここからやり直し
📌 このページのポイント
セーブポイントの仕組み 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」 = 保存地点
💬 ゲームのセーブポイントと同じ発想で、途中の状態を保存しておく地点のことだよ
← 用語集にもどる