メインコンテンツへ
データベースデータベース応用

楽観的ロック(optimistic locking)と悲観的ロック(pessimistic locking)の違いに関する記述として、最も適切なものはどれか。

ア.楽観的ロックは行ロックを取得し他者をブロックする方式で、悲観的ロックはロックを取らない方式である。
イ.楽観的ロックも悲観的ロックも、データベースに対して常に専有ロックを取得するため、性能上の違いはない。
ウ.楽観的ロックは更新時にバージョン番号やタイムスタンプを比較し、自分が読み込んだ後に他者が更新していたら処理を失敗させて再試行する方式で、ロックを取らないため競合が少ない環境で高スループット。悲観的ロックは読み込み時から行ロック等を取り、他者をブロックしてから更新する方式で、競合が多い環境や厳密性が必要な処理に向く。正解
エ.楽観的ロックはSELECT文で取得され、悲観的ロックはUPDATE文で取得される自動的な機能であり、開発者が選択することはない。

解説

楽観的ロックは「みんな譲り合うはず」と信じて並んで取りに行く方式、悲観的ロックは「絶対に他人に取られないよう先に陣取る」方式。楽観は競合少なめの環境で速いが、競合が多いとリトライが頻発します。

なぜ ウ が正解か

ウが正解。楽観的ロックは「競合は稀」という前提で、UPDATE時にWHERE句に「version=元の値」を含め、影響行数0なら他者が更新済みと判断してアプリ側で再試行(リトライ)する。Hibernate @Versionなどが代表例。悲観的ロックはSELECT ... FOR UPDATEなどで読み込み時から専有ロックを取得し、他者をブロックして競合自体を起こさない。競合多発の在庫管理・座席予約などで使う。

なぜ ア は間違いか

逆の説明。「楽観的=ロックを取らない、悲観的=ロックを取る」が正しい関係。

なぜ イ は間違いか

両者の最大の違いはまさにロック取得の有無と性能特性。楽観的はロックフリー、悲観的は明示ロックという根本的な違いがある。

なぜ エ は間違いか

開発者が用途に応じて選択するのが普通。SELECT/UPDATEで自動切替されるわけではなく、設計判断とコード実装による選択。

出典: AI生成問題(学習用)