排他制御は、共有資源の競合を防ぐための制御全体を指します。排他ロックは、その実現に使うロックの一種です。「目的・仕組み」と「具体的な手段」を分けると理解しやすくなります。
制御全体とロックの一種を比較する
| 観点 | 排他制御 | 排他ロック |
|---|---|---|
| 位置付け | 共有資源の競合を制御する仕組み全体 | 競合するアクセスを制限する具体的なロック |
| 目的 | 共有データの整合性を守る | 保護対象への競合する更新などを待たせる |
| 対象の例 | メモリ・ファイル・DB | DBの行や表など |
| 関連する手段 | ミューテックス・セマフォなど | 専有ロック(Xロック)など |
同時更新による不整合を防ぐ
残高100をAとBが読み、Aが90、Bが80を保存した場合、Aの更新が失われることがあります。必要な処理のまとまりを保護するため、ロックを取得してから処理し、終了時に解除します。DBのトランザクションでは、更新ロックがCOMMITやROLLBACKまで保持されることがあります。
共有ロックとの違い
| 既に取得されているロック | 新しい共有ロック(S) | 新しい専有ロック(X) |
|---|---|---|
| 共有ロック(S) | 取得できる | 待つ |
| 専有ロック(X) | 待つ | 待つ |
これは、同じ対象に対して異なるトランザクションがロックを要求する基本モデルです。実際のDB製品には複数のロックモードやMVCCがあり、専有ロック中でも過去の確定済みデータを通常のSELECTで読める場合があります。
試験では「共有同士は共存可能、専有を含む組合せは競合」と整理できます。実際のDBではMVCCによる読み取りや追加のロックモードがあるので、「排他ロック中はあらゆる読み取りが絶対に不可能」とは一般化しません。
排他制御はロックだけではない
更新前にバージョンを比較し、競合した場合に再試行する楽観的な制御もあります。楽観ロックという呼び名でも、長時間ロックを保持して相手を待たせる方式とは動作が異なります。対象と競合時の扱いを確認しましょう。
デッドロックとの関係

資源を複数取得する場合は順序を統一するなど、待ちが循環しない設計が必要です。検出後に一方をROLLBACKする方法は、既に起きた状態を解消する方法として区別します。
理解を確かめる確認問題
「排他制御と排他ロックは、常に同じ意味である」は正しいでしょうか?
解答・解説を見る
誤りです。排他制御は競合を防ぐ制御全体を指し、排他ロックは具体的な手段の一つです。共有ロックや楽観的な制御との関係も整理しましょう。


コメント