LoginSignup
5
1

More than 5 years have passed since last update.

トランザクションの隔離レベルの設定とtx_isolationのメモ

Last updated at Posted at 2016-06-21

調査したので、メモを残した。

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」に変わっている。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1