概要
サクッとメタデータロックを体感する。
前提知識
MySQLのオンラインDDLを利用すれば、ほぼロックすることなしに大きなテーブルに対してALTERをかけることができる。
実施するALTERによるが、MySQLは3つの変更方式を提供している。
- COPY
- 遅い
- オンラインDDLではない
- INPLACE
- まぁ早い
- オンラインDDL
- INSTANT
- 早い
- オンラインDDL
オンラインDDLとはなんぞや?については、まぁDDL実行中も大体DML打てるやつのことをそう言ってるっぽい。
https://dev.mysql.com/doc/refman/8.4/en/innodb-online-ddl.html
ただ、色々な記事でオンラインDDLでもメタデータロックには気をつけなはれやと言ってくるのでとりあえず実感してみたいなと思ったのが執筆のきっかけ。
体感
3つのDBへのセッションを用意する。
それぞれsession-a, session-b, session-c と呼ぶ。
まずsession-aでトランザクションを張る
SET autocommit = 0;
START TRANSACTION;
SELECT * FROM user;
次にsession-bでオンラインDDLを実行する。
ALTER TABLE user
ADD COLUMN `name` VARCHAR(255) DEFAULT NULL,
ALGORITHM = INSTANT;
ただ、これはメタデータに対してexclusiveなロックを要求するため、session-aのトランザクションの存在によって待たされる。
次にsession-cで単純なselectを実行する。
SELECT * FROM user;
なんとこれも即座に成功せず、待たされる。
MySQLは「EXCLUSIVE待ちがいるなら、新規SHAREDは入れない」設計となっているためだ。
終わりに
起きたら全てが止まるので怖いね。