そらとぶへび

仕事・プライベートを通しての気づき、JavaやPHP、データベースやサーバの話などこつこつと書いていきます

ALTER TABLEによるセッションのロック

MYSQLトランザクション中のテーブルに対し、ALTER TABLEを実行したらどうなるのか?
試してみたところ、トランザクションを終了するまで、他のセッションをロックしてしまう。

検証パターン

①コンソールからMysqlへ接続してトランザクション開始

start transaction;
select * from test;

②別コンソールを立ち上げて、ALTER TABLEなどを実行。

ALTER TABLE test add column b char(10) default 'b';

③さらに別コンソールを立ち上げて、SELECTを実行。

select * from test;


①でトランザクションを終了するまで、②、③の結果は返らない。

トランザクションの分離レベルを変えてみる

セッションをダーティリードに変更したら、コミット前の変更が別トランザクションから参照できるので、回避できるのでは?と思ったが、試してみた結果は同じ、結果は返らない。
セッション単位でロックしているだろうか?

SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set (0.00 sec)
結論

バッチ処理等の長いトランザクションが実行されている中でALTERコマンドを実行しない。
SELECT文であっても、ロックがかかるので、不必要にトランザクション処理しない。