専有ロックとは?初心者でもわかるデータベースの排他制御をやさしく解説!
生徒
「先生、“専有ロック(センユウロック)”って聞いたことがあるんですが、共有ロックと何が違うんですか?」
先生
「良い質問です。専有ロックは、他の人がデータに触れないように完全にロックする仕組みです。英語では“Exclusive Lock(エクスクルーシブロック)”と呼ばれます。」
生徒
「触れないって、読むこともできないんですか?」
先生
「そうなんです。専有ロックがかかっているデータは、他の人は読み取ることも書き換えることもできません。完全に“その人だけのデータ”になるんです。」
生徒
「なるほど!じゃあ、共有ロックが“みんなで読む”、専有ロックは“ひとり占め”って感じですね!」
先生
「その通りです!では、専有ロックの仕組みと特徴を詳しく見ていきましょう。」
1. 専有ロック(センユウロック)とは?
専有ロックとは、データベース(Database/データベース)の排他制御(ハイタセイギョ)において使われるロックの一種です。英語では「Exclusive Lock(エクスクルーシブロック)」といい、あるデータを1つのトランザクション(Transaction/トランザクション)が専有するために使われます。
専有ロックが設定されると、他のトランザクションはそのデータを読むことも書くこともできません。これにより、同時アクセスによるデータの不整合(フセイゴウ)や二重更新(ニジュウコウシン)を防ぐことができます。
2. 専有ロックの目的と役割
専有ロックの目的は、複数の処理が同時に同じデータを変更してしまう事態を防ぐことです。もしロックがなければ、二人のユーザーが同じ在庫データを同時に減らしてしまい、結果が合わなくなることがあります。
専有ロックを使えば、最初にデータを操作した人が処理を完了するまで、他の人は待機状態になります。これにより、データの整合性(セイゴウセイ)と信頼性が確保されます。
3. 共有ロックとの違い
共有ロック(Shared Lock/シェアードロック)は、データを“読むだけ”のときに使われます。一方、専有ロックは“更新や削除などの書き込み処理”を行うときに使われます。
| 種類 | 読み取り | 書き込み | 他のロックとの共存 |
|---|---|---|---|
| 共有ロック(Shared Lock) | 〇可能 | ×不可 | 他の共有ロックと共存できる |
| 専有ロック(Exclusive Lock) | ×不可 | ×不可 | 他のどんなロックとも共存できない |
つまり、専有ロックがかかっているデータは完全に一人専用の状態になります。
4. 専有ロックの動作イメージ
実際の動きをイメージしてみましょう。
- Aさんが「商品A」の在庫数を変更するためにデータを開くと、専有ロックがかかります。
- Bさんが同じ「商品A」を読み取ろうとしても、Aさんの処理が終わるまで待機します。
- Aさんのトランザクションが完了し、コミット(Commit/コミット)されると、ロックが解除されます。
このように、専有ロックは「他の人が途中で割り込めない状態」を作る仕組みです。
5. 専有ロックが使われるタイミング
専有ロックは、次のような操作で使われます。
- データの更新(UPDATE)
- データの削除(DELETE)
- 新しいデータの追加(INSERT)
これらの操作は、データ内容を変更するため、排他制御が必須です。専有ロックをかけることで、同時実行によるデータの衝突を防止します。
6. 専有ロックのメリットとデメリット
メリット
- データの整合性(セイゴウセイ)を確実に守ることができる。
- 同時実行時のデータ破損や矛盾を防げる。
- トランザクションの信頼性を高める。
デメリット
- 他の処理が待たされるため、パフォーマンス(処理速度)が低下する。
- 長時間ロックが続くと、デッドロック(Deadlock/デッドロック)を引き起こす可能性がある。
- 大規模なトランザクションでは待機が連鎖して全体が遅くなることがある。
専有ロックは安全性を優先するための手法ですが、使いすぎると効率が悪くなることもあります。
7. デッドロック(Deadlock/デッドロック)と専有ロックの関係
専有ロックを使うときに注意したいのが、デッドロックという問題です。デッドロックとは、複数のトランザクションがお互いのロック解除を待ち続け、永久に進めなくなる状態のことです。
たとえば、トランザクションAが「商品A」をロックして「商品B」を待ち、同時にトランザクションBが「商品B」をロックして「商品A」を待つ…という状況です。どちらも待ち続けて動かなくなります。
このような場合は、データベースが自動的に片方の処理を中断してロックを解除するよう設計されています。設計者側でも、ロックの順序を統一したり、処理時間を短くしたりして予防することが大切です。
8. 専有ロックの効率的な使い方
実際のシステムでは、専有ロックをどこでかけるか、どのタイミングで解除するかがパフォーマンスに大きく影響します。以下のような工夫が有効です。
- 必要な範囲だけロックをかける(テーブル全体ではなく、特定の行だけなど)。
- トランザクションを短く保ち、すぐにコミットする。
- 更新頻度の低いテーブルではロックの粒度(リュウド)を大きくして安全性を優先する。
このように、専有ロックはシステムの安定性を守る一方で、設計とチューニング(最適化)が求められる技術でもあります。
9. 専有ロックと実践イメージ
専有ロックは、データベースの安全な書き込み処理を保証する鍵です。銀行の口座残高更新やネットショッピングの在庫処理など、私たちの身近なサービスでも必ず使われています。
共有ロックが「みんなで読むためのロック」なら、専有ロックは「一人だけが使うためのロック」。この違いを理解することで、データベース設計の基礎がぐっと深まります。
データの整合性を守りながら効率よく処理を行うためには、専有ロックと共有ロックをうまく使い分けることが大切です。