データベースのロックには大きく分けて共有ロックと排他ロックがある。

  • 共有ロック: 読み取り側のロック。他のトランザクションも同時に読み取りできる。
  • 排他ロック: 書き込み側のロック。他のトランザクションからの読み取り・書き込みをブロックする。
  共有ロック(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