PostgreSQLのMVCCとロックの関係を完全解説!初心者でもわかる同時実行制御の仕組み
生徒
「PostgreSQLにはMVCCっていう仕組みがあると聞いたんですが、ロックとどう関係しているんですか?」
先生
「MVCCは、ロックをなるべく使わずに、たくさんの人が同時に使えるようにする工夫です。」
生徒
「ロックを使わないなら、データはどうやって守っているんですか?」
先生
「昔のデータを残しながら、新しいデータを見る仕組みを作っているんです。写真アルバムを想像するとわかりやすいですよ。」
1. SQLとは何か?
SQLは、データベースという「情報をきれいに整理して保存する箱」に命令を出すための言葉です。 データベースは、紙の名簿や表をパソコンの中に保存したようなものです。
PostgreSQLは、そのSQLを使って操作できるデータベースで、 多くの人が同時に使っても壊れにくい特徴があります。 その中心となる考え方が、MVCCとロックです。
2. 同時実行制御とは?
同時実行制御とは、複数の人が同じデータベースを同時に使っても、 データが壊れないようにする仕組みです。
例えば、同じ名簿を何人もが同時に開いて、 ある人は読むだけ、ある人は書き直す、という状況を考えてみてください。 何もルールがないと、内容が混ざってしまいます。
PostgreSQLでは、この問題をMVCCとロックの組み合わせで解決しています。
3. MVCCとは何か?
MVCCは、「マルチバージョン同時実行制御」という仕組みです。 少し難しい言葉ですが、意味はとてもシンプルです。
「同じデータでも、複数のバージョンを持っておき、 人それぞれが自分に合ったバージョンを見る」という考え方です。
写真アルバムで例えると、 昔の写真も残しつつ、新しい写真を追加していくイメージです。 誰かが新しい写真を追加していても、 他の人は古い写真を安心して見ることができます。
4. MVCCがあると何がうれしいのか
MVCCがあるおかげで、PostgreSQLでは「読む人」と「書く人」が ぶつかりにくくなっています。
読み取りは基本的にロックをかけずに行われます。 そのため、誰かがデータを更新していても、 他の人は止まらずにデータを見ることができます。
これが、PostgreSQLが「止まりにくいデータベース」と言われる理由です。
5. MVCCとロックの関係
MVCCがあるからといって、ロックが完全になくなるわけではありません。 PostgreSQLでは、役割を分けて使っています。
読み取りはMVCCで守り、 書き込み同士がぶつからないようにするためにロックを使います。 つまり、MVCCは読み取りを助け、 ロックは書き込みの安全を守る存在です。
6. データを読むときの動き
SELECT文でデータを読むとき、 PostgreSQLは「その人に見えてよいバージョンのデータ」を選びます。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
SELECT *
FROM users
WHERE age >= 20;
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
このとき、誰かが別の場所で更新していても、 SELECTは止まらずに実行できます。
7. データを更新するときの動き
UPDATEでは、古い行を直接書き換えるのではなく、 新しい行を追加します。 これがMVCCの大きな特徴です。
UPDATE users
SET age = 26
WHERE 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
このとき、更新対象の行にはロックがかかります。 これは、同時に同じ行を変更されないようにするためです。
8. DELETEとMVCC
DELETEも、実際にはすぐに消えるわけではありません。 「消された」という印を付けるだけです。
DELETE FROM users
WHERE id = 2;
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 26 | taro@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
古いデータは、必要がなくなったタイミングで整理されます。 これもMVCCによる安全な仕組みです。
9. 初心者が覚えておくポイント
PostgreSQLでは、読む処理はMVCCが守り、 書く処理はロックが守っています。
MVCCのおかげで、ロックが少なくても安全に同時利用できます。 最初は「コピーを見ているから止まらない」と考えると理解しやすいです。
この考え方を知ることで、PostgreSQLの動きがぐっと身近になります。