2024/12/18 PostgreSQL ACCESS EXCLUSIVE
わたしのTIL Advent Calendar 2024 - Adventar 18日目
担当するサービスで PostgreSQL をまともに扱うようになったため、わたしは新しく知ることが多いです
とはいえ、ほかの RDBMS についてもそこまで深く知っているとは言えません
レビュー中に調べていて知ったのですが、PostgreSQL の ALTER TABLE では一番強いレベルのテーブルロック(ACCESS EXCLUSIVE)がかかるとドキュメントにありました
レビューはマイグレーションのための ALTER TABLE ADD COLUMN... でしたが、オンラインDDLについて詳しくなかったので調べた経緯 (なお現時点においても MySQL におけるオンラインDDLについてもあまり詳しくないです)
(バージョンは16.xを想定)
https://www.postgresql.jp/document/16/html/sql-altertable.html
要求されるロックレベルはそれぞれの副構文によって異なることに注意してください。 特に記述がなければACCESS EXCLUSIVEロックを取得します。 複数のサブコマンドが使われるときは、それらのサブコマンドが要求するうち、もっとも高いレベルのロックを取得します。
https://www.postgresql.jp/document/16/html/explicit-locking.html
ACCESS EXCLUSIVEロックのみが、SELECT(FOR UPDATE/SHAREなし)文をブロックします。
試してみます
code:docker.sh
$ docker run -dit --name postgres16 -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust --init postgres:16
セッションAで ALTER TABLE ADD COLUMN... をします
code:A
$ psql -U postgres -h 127.0.0.1
postgres=# create table users (id serial primary key, name text not null);
CREATE TABLE
postgres=# begin;
BEGIN
postgres=*# alter table users add column age integer;
ALTER TABLE
セッションBで SELECT 文を実行します
code:B
$ psql -U postgres -h 127.0.0.1
postgres=# select * from users;
ここで待たされます
薄い知識ですが MySQL のオンラインDDLとはちょっと違うんですよね
https://gihyo.jp/article/2023/11/mysql-rcn0208
本日は以上です