Work Records

日々の作業記録です。ソフトウェアエンジニアリング全般から、趣味の話まで。

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が打てない感じになります。

autocommitはONが良い気がする

ということで、autocommitは基本的にONが良いと思います。
この場合、明示的にトランザクションを開始しないとロックがかからないのでALTERが固まる事は無いです。
ただし、直接MySQLにターミナルから繫いで手で更新処理を打つ場合には、BEGINしてトランザクションを開始しておいた方がオペミス時にrollbackが出来るので良いとは思います。

また、アプリケーション側のロジックでも明示的にトランザクションを使うところと使わないところを分けられるので、サーバー側の設定はONの方が色々と調整がうまく行きそうです。


[asin:4873116384:detail]
[asin:4797369450:detail]