一括りにデータベースのトランザクションと言っても、
検証環境
第10回 yum, rpmインストールにおけるMySQL 5.
現在のトランザクション分離レベルを確認する
変更を行う前に、
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation; +-----------------------+-----------------+ | @@GLOBAL.tx_isolation | @@tx_isolation | +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
最初は設定を変更していないため、
トランザクション分離レベルを変更する
トランザクション分離レベルを変更する際には、
- SET TRANSACTION構文を使って変更する
- mysqldから起動する際にオプションを指定する
- my.
cnfに設定する
続いて、
SET TRANSACTION構文で変更する
まずは、
mysql> SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 指定したいトランザクション分離レベル
指定できるトランザクション分離レベルとしてSERIALIZABLE
, REPEATABLE READ
, READ COMMITTED
, READ UNCOMMITTED
の4種類が選択できます。デフォルトではREPEATABLE READ
が設定されています。GLOBALやSESSIONオプションは、
mysql> SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation; +-----------------------+----------------+ | @@GLOBAL.tx_isolation | @@tx_isolation | +-----------------------+----------------+ | REPEATABLE-READ | SERIALIZABLE | +-----------------------+----------------+ 1 row in set (0.00 sec)
SESSIONで設定した場合はコネクションを再接続した際に、
余談ではありますが、SET PERSIST
というコマンドが追加されています。こちらを利用すると設定をコマンドラインから永続化することができます。このコマンドで設定した場合、mysqld-auto.
にJSONファイルとして書き出され、
mysql> SET PERSIST TRANSACTION ISOLATION LEVEL SERIALIZABLE; Query OK, 0 rows affected (0.00 sec) # pwd /var/lib/mysql # cat mysqld-auto.cnf { "mysql_server": {"tx_isolation": "SERIALIZABLE" } }
起動時にオプションを指定をする
CentOS7以降だとsystemctlコマンドを使って起動します。起動時に指定するOPTIONは、set-environment
オプションで設定を行います。一部キーワードがSET TRANSACTION構文と異なることに注意が必要です。オプションに使える値はSERIALIZABLE
, REPEATABLE-READ
, READ-COMMITTED
, READ-UNCOMMITED
の4つです。
# systemctl set-environment MYSQLD_OPTS="--transaction-isolation=SERIALIZABLE" # systemctl restart mysqld.service
再起動を行った後に起動後確認をすると、SERIALIZABLE
になっています。
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation; +-----------------------+----------------+ | @@GLOBAL.tx_isolation | @@tx_isolation | +-----------------------+----------------+ | SERIALIZABLE | SERIALIZABLE | +-----------------------+----------------+ 1 row in set (0.00 sec)
またMYSQLD_systemctl unset-environment
コマンドを実行して再起動すると元の設定に戻ります。
# systemctl unset-environment MYSQLD_OPTS # systemctl restart mysqld.service mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation; +-----------------------+-----------------+ | @@GLOBAL.tx_isolation | @@tx_isolation | +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
以上からデフォルトのREPEATABLE-READ
に戻っていることがわかります。もし、systemctl show-environment
コマンドで設定した環境変数が確認できます。
# systemctl show-environment LANG=en_US.UTF-8 MYSQLD_OPTS=--transaction-isolation=SERIALIZABLE PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
このように起動時にオプションとして設定することもできます。ただし後述するように、
my.cnfファイルで設定をする
my.
my.SERIALIZABLE
, REPEATABLE-READ
, READ-COMMITTED
, READ-UNCOMMITED
の4つです。今回は/etc/
内に以下の設定を行いました。
[mysqld] transaction-isolation = READ-COMMITTED
その後再起動を行い、
# systemctl restart mysqld.service mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation; +-----------------------+----------------+ | @@GLOBAL.tx_isolation | @@tx_isolation | +-----------------------+----------------+ | READ-COMMITTED | READ-COMMITTED | +-----------------------+----------------+ 1 row in set (0.00 sec)
設定がREAD-COMMITED
に変更されていることがわかります。
まとめ
今回はトランザクション分離レベルを変更する方法について紹介しました。トランザクション分離レベルの各設定の違いに関しては、