PostgreSQLの行ロックとテーブルロックを完全解説!初心者でもわかる違いと仕組み
生徒
「PostgreSQLのロックって、行ロックとかテーブルロックとか種類があるみたいですが、何が違うんですか?」
先生
「簡単に言うと、どこまで広く鍵をかけるかの違いです。1行だけなのか、表まるごとなのか、という違いですね。」
生徒
「パソコンに詳しくなくても理解できますか?」
先生
「もちろんです。名簿に鉛筆で名前を書く場面を想像しながら説明します。」
1. SQLとは何か?
SQLは、データベースという「情報を整理して保管する箱」に対して指示を出すための言葉です。 データベースは、紙の名簿や表を電子化したような存在で、名前や年齢、連絡先などを整理して保存できます。
PostgreSQLは、そのSQLを使って操作できるデータベースの一つで、 たくさんの人が同時に使っても安全に動くように工夫されています。 その安全を支えている重要な仕組みが「ロック」です。
2. ロックとは何か?
ロックとは、「他の人が同時に同じ場所を触れないようにする仕組み」です。 データベースは一人で使うものではなく、複数人が同時に操作します。 そのため、何も対策をしないとデータが壊れてしまいます。
例えば、同じ名簿を二人が同時に消しゴムで消したら、 どちらの内容が正しいかわからなくなります。 それを防ぐためにロックが使われます。
3. 行ロックとは?
行ロックは、表の中の「1行だけ」に鍵をかける仕組みです。 名簿で例えると、特定の1人の名前の行だけを保護するイメージです。
PostgreSQLでは、UPDATEやDELETEなどで特定の行を変更すると、 自動的にその行にロックがかかります。 他の人は、別の行なら同時に作業できます。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
UPDATE users
SET age = 26
WHERE id = 1;
この場合、idが1の行だけがロックされます。 他の行は自由に読み書きできます。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 26 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
4. テーブルロックとは?
テーブルロックは、表全体に鍵をかける仕組みです。 名簿で言うと、「この名簿は今使えません」と全員に伝える状態です。
大きな変更を行うときや、表の構造を変えるときに使われます。 その間、他の人はその表を操作できなくなります。
LOCK TABLE users IN ACCESS EXCLUSIVE MODE;
この命令を実行すると、usersテーブル全体がロックされます。 安全ですが、その分待ち時間が発生しやすくなります。
5. 行ロックとテーブルロックの違い
行ロックは「狭く安全」、テーブルロックは「広く確実」という特徴があります。 行ロックは他の作業を邪魔しにくく、普段の更新処理でよく使われます。
テーブルロックは強力ですが、同時作業を止めてしまうため、 必要な場面だけで使われます。 PostgreSQLは基本的に行ロックを優先する設計です。
6. SELECTとロックの関係
SELECTは「見るだけ」の操作なので、 通常は行ロックやテーブルロックを邪魔しません。
PostgreSQLは、同時に見られる仕組みを持っているため、 読み取りが多くても止まりにくい特徴があります。
SELECT *
FROM users
WHERE age >= 20;
7. 初心者が押さえておくポイント
行ロックは普段の更新で自動的に使われます。 テーブルロックは特別な場面で使われる強いロックです。
最初は「1行だけ守るのが行ロック」「全部守るのがテーブルロック」 というイメージを持つだけで十分です。 これを理解することで、PostgreSQLの同時実行制御がぐっと身近になります。