共有ロックと専有ロックとは?きょうゆうろっくとせんゆうろっく
共有ロックと専有ロックとは、同じ資源に対し、共有ロック(Sロック)どうしは同時に掛けられるが、専有ロック(Xロック)は共有・専有のどちらとも同時には掛けられない。この可否の組合せが、どの処理がどこで待たされるかを決める。読み取りで実際にSロックを取るかどうかは製品によって違う。
最終更新:2026-10-06
データベースSPを最短で暗記・合格する →背景
同じ在庫行を2つの更新が同時に書けば、一方の更新が消える(ロストアップデート)。これを防ぐ最も素直な手段が、資源に印を付けて競合する操作を待たせるロックである。ただし読み取りまで待たせると同時実行性が落ちるため、多くの製品は読み取りを版管理(MVCC)で処理し、ロックは更新に絞る方向へ進んだ。
具体例
PostgreSQLとOracleは通常のSELECTで行ロックを取らず、更新中の行も更新前の版が読める。ロックが要るときは SELECT … FOR UPDATE(X相当)や FOR SHARE(S相当)を明示する。MySQLのInnoDBでは FOR UPDATE が隙間(ギャップ)にもロックを掛け、待ちの上限は innodb_lock_wait_timeout の既定50秒。PostgreSQLは lock_timeout が既定0で待ち続ける。
試験での引っ掛け
SとSは両立、SとX・XとXは非両立という組合せの取り違えが第一の失点源。第二に「SELECTは必ずSロックを取る」と覚えるとPostgreSQL・Oracleの実装と食い違う。またロック粒度を細かくすると同時実行性は上がるが管理量が増え、SQL ServerやDB2はロックエスカレーションで表ロックへ格上げする(InnoDBにこの仕組みはない)。
関連用語
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。