トランザクション・排他制御・分離レベル 重要度:★★★出題: AM2・PM1・PM2
SELECT ... FOR UPDATE(悲観的排他制御・行レベル専有ロック)
せれくとふぉーあっぷでーと / SELECT ... FOR UPDATE (Pessimistic Row Locking)
後続のUPDATE/DELETEに備えて、SELECT文による行読込みの時点で対象行に専有ロック(排他ロック)を掛け、他トランザクションからの更新や専有ロック取得をブロックするSQL句。
3行速習ポイント
- READ COMMITTED環境で「在庫数をSELECTで確認してからアプリで引き当て計算しUPDATEする」際のロストアップデート(更新紛失)を防止する
- 通常のSELECT(共有ロックまたはロックなし)の後にUPDATEするとデッドロックや二重引当てが起きるため、読込み時点で専有ロックを獲得する
- ただし画面表示からユーザーのボタン押下までトランザクションをまたぐ対話型処理ではロック保持時間が長くなるため、タイムスタンプ等による楽観的排他制御を用いる
図解
図SELECT ... FOR UPDATE による悲観的排他制御シーケンス
11. SELECT ... FOR UPDATE
Lock Acquired対象行の読取りと同時に行レベルの専有ロック(Xロック)を獲得
22. 在庫・残高チェックとUPDATE
Safe Update他トランザクションの割り込みをブロックした安全な状態で引当て計算・更新を実行
33. COMMIT によるロック解放
Unlockトランザクション完了により専有ロックを解放し、後続トランザクションへ制御を渡す
概要と本質
午後I・午後IIのトランザクション設計問題で最も登場回数が多いSQL句です。「在庫引当て」「残高更新」「予約枠確保」など、現在の値を読み取ってチェックした後に更新する処理では、SELECTの直後に他トランザクションが割り込んで同じ行を読み書きするのを防ぐため、`FOR UPDATE` 句による専有ロックの事前取得が必須となります。
重要ポイント・コア概念
- ロックが解放されるタイミング:当該トランザクションが COMMIT または ROLLBACK を実行した時点
- 索引が使われない場合や検索条件によっては、対象行だけでなくテーブル全体や範囲にロックが掛かり同時実行性が低下するため、主キーまたは一意索引で対象行を絞り込むことが重要
- NOWAITオプションやロック待ちタイムアウトを設定することで、長時間ロック解放待ちで滞留するのを防ぐ
午後I・午後II記述試験での攻略ポイント
午後試験のSQL穴埋めや改善策の記述で「複数トランザクションが同時に実行された際、在庫数がマイナスになったり更新が上書きされたりする不具合をどう防ぐか」と問われたら、『SELECT文にFOR UPDATE句を指定する』『対象テーブルの行に専有ロックを掛けて読み込む』が王道の正解になります。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着令和3年 秋期 午前II 問14
RDBMSのロックに関する記述のうち,適切なものはどれか。ここで,X,Yはトランザクションとする。...
この過去問を解く(1分演習)
令和7年 秋期 午後I 問3
SQLの設計とトランザクション排他制御・索引設計...
この過去問を解く(1分演習)
令和7年 秋期 午後II 問1
コード決済業務及びポイント管理業務におけるデータベースの実装・運用(排他制御、2相コミットプロトコル、補償トランザクショ...
この過去問を解く(1分演習)
令和6年 秋期 午後II 問1
バッチ処理のオンライン時間帯移行に伴う排他制御,障害回復見積り及びテーブル設計・運用...
この過去問を解く(1分演習)
データベーススペシャリスト 過去問演習で実践力を鍛える