調査したので、メモを残した。
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.6.10 |
+-----------+
トランザクションの隔離レベルは、変数を見ればわかる。
MySQLの場合、デフォルトは「REPEATABLEーREAD」。
mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| REPEATABLE-READ | REPEATABLE-READ |
+-----------------------+------------------------+
隔離レベルを設定するには、SET TRANSACTION構文を用いる。
TRANSACTIONには3つのスコープがある
- グローバル
- セッション
- 直後のトランザクション
「GLOBAL」も「SESSION」も指定しなければ、直後のトランザクションに対して適用される。
mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| REPEATABLE-READ | REPEATABLE-READ |
+-----------------------+------------------------+
グローバルでも、セッションでもないので、変数の値は変わらない。
「SESSION」を指定すれば、そのセッションのそれ以降のすべてのセッションに適用される。
mysql> SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| REPEATABLE-READ | SERIALIZABLE |
+-----------------------+------------------------+
セッションのtx_isolationが「SERIALIZABLE」に変わっている。
「GLOBAL」を指定すれば、それ以降に開始されたすべてのセッションに適用される。
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| READ-UNCOMMITTED | SERIALIZABLE |
+-----------------------+------------------------+
グローバルのtx_isolationが「READ-UNCOMMITTED」に変わっている。
再接続すると、グローバルの設定がセッションに反映される。
mysql> CONNECT;
Connection id: 2
Current database: *** NONE ***
mysql> SELECT @@global.tx_isolation, @@session.tx_isolation;
+-----------------------+------------------------+
| @@global.tx_isolation | @@session.tx_isolation |
+-----------------------+------------------------+
| READ-UNCOMMITTED | READ-UNCOMMITTED |
+-----------------------+------------------------+
セッションのtx_isolationがグローバルと同じ「READ_UNCOMMITTED」に変わっている。