読者です 読者をやめる 読者になる 読者になる

Work Records

日々の作業記録です。iPhone・androidアプリなど作っています。http://waremon.parseapp.com/

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の方が色々と調整がうまく行きそうです。


実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )