このラボでは、社内のポイント送金機能を任されたバックエンド担当の想定で、「残高が消える」「二重に送られる」「マイナスになる」を DB の仕組みで防ぐ方法を実機で身につけます。
ブラウザで開く IDE の PostgreSQL に、口座テーブル accounts(10 口座 × 100,000 円、合計 1,000,000 円)が入っています。送金関数を PL/pgSQL で書き、わざと失敗させて「途中で止まっても残高の合計は変わらない」ことを確かめ、2 つのターミナルで同じ口座を同時に更新してロック待ちを観察します。
学習目標:
BEGIN / COMMIT / ROLLBACK と、関数内の例外による自動ロールバック(原子性)SELECT ... FOR UPDATE による行ロックで、同時更新の競合を防ぐCHECK 制約で「残高は 0 以上」を DB 側で保証するpg_locks / pg_stat_activity でロック待ちを観察するUPDATE / SELECT の基本と、「SQL 入門」「SQL 中級」ラボ相当の知識balance >= 0 の CHECK 制約、transfer(from_id, to_id, amount) 関数(FOR UPDATE を使用)、transfer_audit への記録トリガーがあることlocks_notes.md にロック待ちの観察結果が書かれていること詳細な手順は、ラボ開始後に画面内のガイドとして表示されます。
本番形式の問題で理解度を確認できます。各試験とも先頭 15 問は無料です。