MySQLでautocommitをONにしておかないとALTERがロック待ちで固まった
開発中の環境でALTERを打ったらロック待ちで固まって焦った
原因は、autocommitがOFFになっていたのと、他の作業者がMySQLに接続していたから。
autocommitがOFFだとMySQLに接続してクエリを発行したタイミングでトランザクションが開始される、そのためもう一つの接続先からALTERを打つとロック待ちになる、という現象でした。
こんなテーブルを作って。
mysql> create table test (id int, name varchar(10));
接続元1でselectを打つ
mysql> select * from test; Empty set (0.00 sec)
autocommitがOFFの場合、このタイミングでトランザクションが開始され、テーブルor行にロックがかかる(インデックスが効いていれば行ロック)。
今まで勘違いしていたけど、更新処理開始時ではなくselectでもトランザクションが開始されるっぽい。
REPEATABLE READなので考えてみれば当たり前か。
ここで、接続元2からalterを打つ。
mysql> alter table test change column id id bigint; (返ってこない。。。)
トランザクションによりロックがかかっているのでALTERが打てない感じになります。