共有ロックとは?初心者でもわかるデータベースの同時アクセス制御を解説!
生徒
「先生、“共有ロック(キョウユウロック)”っていう言葉を聞いたんですが、どういう意味なんですか?」
先生
「共有ロックは、データベース(Database/データベース)の排他制御(ハイタセイギョ)の一種で、データを“読むだけ”のときに使われるロックのことです。」
生徒
「読むだけ?それならロックをかける必要はない気がしますけど…?」
先生
「実は、他の人が同じデータを同時に書き換えると、読んでいる途中で内容が変わってしまうんです。共有ロックは、それを防ぐために使うんですよ。」
生徒
「なるほど!つまり、みんなで読むことはできるけど、誰も書けないようにするってことですね?」
先生
「その通り!では、共有ロックの仕組みを詳しく見ていきましょう。」
1. 共有ロック(キョウユウロック)とは?
共有ロックとは、データベースでデータを読み取るときに使用するロックのことです。英語では「Shared Lock(シェアードロック)」と呼ばれます。このロックをかけると、他のユーザーも同じデータを読むことはできますが、書き込み(更新)はできなくなります。
つまり、「読むだけならみんなOK」「書き込みはロック解除まで待つ」というルールです。データを安全に読み取りつつ、整合性(セイゴウセイ)を保つための重要な仕組みです。
2. 排他制御(ハイタセイギョ)と共有ロックの関係
排他制御とは、同時アクセスによるデータの競合(キョウゴウ)を防ぐための仕組みです。共有ロックは、その中でも「読み取り専用の制御」に分類されます。
排他制御には大きく2種類あります。
- 共有ロック(Shared Lock):データを読むときに使用。複数の読み取りが同時に可能。
- 排他ロック(Exclusive Lock):データを書き換えるときに使用。ほかの読み書きはできなくなる。
つまり、共有ロックと排他ロックはセットでデータベースの整合性を守る仕組みです。
3. 共有ロックの具体的な動き
共有ロックがどのように動くかを、具体例で考えてみましょう。
たとえば、二人のユーザーAさんとBさんが同じテーブルの「商品テーブル」を見ているとします。
- Aさんが「商品A」を読み取ると、共有ロックがかかります。
- Bさんも同じ「商品A」を読むことができます。共有ロック同士は共存できるからです。
- しかし、Cさんが「商品A」の在庫数を更新しようとすると、AさんとBさんのロックが解除されるまで待たされます。
このようにして、共有ロックはデータの“読み取りの安全”を保証しています。
4. 共有ロックの利点と欠点
共有ロックにはメリットもあれば、注意すべき点もあります。
メリット
- 複数のユーザーが同時にデータを読むことができる。
- 読み取り途中にデータが変更されるのを防げる。
- データの整合性と信頼性を保てる。
デメリット
- 書き込み処理が遅れることがある。
- ロックが長時間続くと、他の処理が待たされてパフォーマンスが低下する。
- 共有ロックと排他ロックが重なると、デッドロック(Deadlock/デッドロック)が発生することもある。
そのため、システム設計ではロックの使い方や範囲(リュウド)を慎重に考える必要があります。
5. 共有ロックと排他ロックの違い
共有ロックと排他ロックの違いを表にまとめると、次のようになります。
| 種類 | 読み取り | 書き込み | 他のロックとの共存 |
|---|---|---|---|
| 共有ロック(Shared Lock) | 〇可能 | ×不可 | 同じ共有ロックとは共存できる |
| 排他ロック(Exclusive Lock) | ×不可 | ×不可 | 他のロックとは共存できない |
共有ロックは「複数人で読むことはできるけど、書けない」ルール。排他ロックは「誰もアクセスできない」ルール。この違いをしっかり理解しておきましょう。
6. 共有ロックの使用例
例えば、売上データを分析するレポート作成システムでは、多くの人が同じデータを同時に読む必要があります。このとき、共有ロックを使えば、誰かが読み取り中でも他の人もデータを閲覧できます。
ただし、売上データを修正する処理(排他ロックが必要な更新処理)は、すべての共有ロックが解除されるまで待つ必要があります。
これにより、読み取り中の人が古い情報を読んだり、更新途中の不完全な情報を見てしまうリスクを防ぐことができます。
7. 共有ロックとデッドロック(Deadlock/デッドロック)
共有ロックは便利ですが、注意しないと「デッドロック」と呼ばれる問題が発生します。デッドロックとは、複数の処理が互いにロックを待ち続けて、どちらも進まなくなる状態です。
例えば、Aさんが「商品A」を共有ロックし、Bさんが「商品B」を共有ロックしたあと、それぞれ相手のデータにアクセスしようとすると、ロックが解除されずに止まってしまうことがあります。
これを防ぐために、処理の順序を統一したり、タイムアウト(一定時間で待機を解除)を設定したりするのが一般的です。
8. 共有ロックのまとめ方と設計のポイント
共有ロックを設計するときのポイントは、「どこでロックをかけて、いつ解除するか」を明確にすることです。ロックをかけすぎると処理が遅くなりますが、甘くするとデータの整合性が失われます。
そのため、システムによっては楽観的ロック(Optimistic Lock/ラクカンテキロック)を使って、実際に更新するときだけ整合性を確認する方法も使われます。これにより、共有ロックによる待機を減らせるのです。
共有ロックは、データを安全に読み取るための重要な基本技術です。データベースを扱う上で欠かせない知識として、しっかり理解しておきましょう。