2026-03-01 共有ロック vs 排他ロック
データベースのロックには大きく分けて共有ロックと排他ロックがある。
- 共有ロック: 読み取り側のロック。他のトランザクションも同時に読み取りできる。
- 排他ロック: 書き込み側のロック。他のトランザクションからの読み取り・書き込みをブロックする。
| 共有ロック(S) | 排他ロック(X) | |
|---|---|---|
| 目的 | データの読み取り保護 | データの書き込み保護 |
| 他の共有ロックと共存 | できる | できない |
| 他の排他ロックと共存 | できない | できない |
| SQL例 | SELECT ... FOR SHARE |
SELECT ... FOR UPDATE |
ポイント
- 共有ロック同士は共存できる(複数トランザクションが同時に読める)
- 排他ロックは他のすべてのロックと競合する(書き込み中は誰も触れない)
- この仕組みは MySQL / PostgreSQL / SQL Server など主要な RDBMS で共通
MySQL での例
-- 共有ロック
SELECT * FROM users WHERE id = 1 FOR SHARE;
-- 排他ロック
SELECT * FROM users WHERE id = 1 FOR UPDATE;
FOR SHARE は MySQL 8.0 以降の構文で、旧構文は LOCK IN SHARE MODE。