トランザクション・排他制御・分離レベル 重要度:★★★出題: AM2・PM1・PM2
楽観的排他制御(タイムスタンプ方式・バージョン番号方式)
らっかんてきはいたせいぎょ / Optimistic Concurrency Control (OCC)
データ読込み時にはロックを掛けず、更新(UPDATE)実行時に「読込み時点の最終更新タイムスタンプ(またはバージョン番号)と現在の値が一致するか」をWHERE句で検査して競合を検知する方式。
3行速習ポイント
- データ取得時に主キー値とともに「最終更新TS(タイムスタンプ)列」または「更新カウンタ列」の値も取得しておく
- UPDATE文のWHERE句に `AND 最終更新TS = :取得したTS値` を指定し、同時にSET句で `最終更新TS = CURRENT_TIMESTAMP` に更新する
- 更新件数が0件(SQLの状態コードが該当行なし)だった場合は、他者による割り込み更新があったと判定してロールバック・再試行またはエラー通知を行う
図解
図タイムスタンプ列を用いた楽観的排他制御の3ステップ
11. ロックなし参照(SELECT)
Read TS主キー値・業務データと共に「最終更新TS」列の値を取得して保持
22. 条件付き更新(UPDATE)
Check & SetWHERE 主キー = :k AND 最終更新TS = :取得時TS で更新し、SET句でTSを現在時刻へ更新
33. 更新件数による競合判定
Verify更新1件ならCOMMIT完了、更新0件なら他者更新ありと判定してロールバック・再試行
概要と本質
Webアプリケーションやオンラインシステムにおいて、画面表示(SELECT)から更新ボタン押下(UPDATE)までの間にデータベースのロックを保持し続けるわけにはいかない場合や、ロック競合による待ち時間を極小化したい場合に用いられる排他制御パターンです(令和7年午後I問3設問2などでも出題)。
重要ポイント・コア概念
- 手順①(参照時):対象行のデータと一緒に `最終更新TS` 列の値も取得して変数に保持する
- 手順②(更新時):`UPDATE テーブル SET ..., 最終更新TS = CURRENT_TIMESTAMP WHERE 主キー = :キー AND 最終更新TS = :取得時TS` を実行する
- 手順③(競合判定):更新された行数が0件であれば、読込み後に別トランザクションが更新したと判断し、最初から処理(手順①)をやり直すかエラーを返す
午後I・午後II記述試験での攻略ポイント
午後I・午後IIで時刻印(タイムスタンプ)やバージョン列を用いた同時実行制御が出題されたら、「①参照時に最終更新TS列の値も取得する」「②UPDATEのWHERE句に『最終更新TS列が①で取得した値と一致する』条件を追加する」「③更新対象行が存在しない(0件)場合は①からやり直す」の3ステップを正確に答えられるようにしてください。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着データベーススペシャリスト 過去問演習で実践力を鍛える