テーブルロック
個々の行ではなくテーブル全体にかけるロック。PostgreSQLには8段階(AccessShare、RowShare、RowExclusive、ShareUpdateExclusive、Share、ShareRowExclusive、Exclusive、AccessExclusive)があり、主にDDL操作で取得される。
AccessShareはSELECTが取るロックで、AccessExclusive以外とは両立する。AccessExclusiveはSELECTを含むすべてを止め、ALTER TABLE、DROP TABLE、REINDEXが取得する。典型的なアンチパターンは、1億行のテーブルにデフォルト値付きでALTER TABLE ADD COLUMNを実行することだ。テーブル全体の書き換えとロックが数分続き、アプリがダウンする。現代のPG(11以降)では、NULL許容かつ不変のデフォルト値なら書き換えが発生しない。オンラインDDLツールにはpt-online-schema-change(Percona)、gh-ost(GitHub)、pgroll(Xata)がある。MySQLのInnoDBオンラインDDLは多くの操作をロックなしで処理できる。