end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

mysql(InnoDB)のトランザクション隔離レベル設定方法

最近、ロック待ちにトランザクションが増え、結果としてサーバも負荷傾向にあるので、おさらい。

(ダーティ|ファジー|ファントム)リードの違い

http://itpro.nikkeibp.co.jp/article/COLUMN/20080123/291846/
itproに記載されている通りですが、更に簡単にまとめると次の通り。

ダーティリード トランザクションAのcommit前データをトランザクションBが読込可能
ファジーリード トランザクションBが2回読込む間にトランザクションAのcommitでレコード変更
ファントムリード トランザクションBが2回読込む間にトランザクションAのcommitでレコード追加/削除

※ファジーリードはノンリピータブル・リードとも言います

隔離レベルと(ダーティ|ファジー|ファントム)リードの関係 - InnoDBはより強力みたい

先程のitproによれば、次の通りです。

- ダーティ ファジー ファントム
READ UNCOMMITTED あり あり あり
READ COMMITTED - あり あり
REPEATABLE READ - - あり
SERIALIZABLE - - -

http://nippondanji.blogspot.jp/2009/03/mysql7.html
http://momijiame.tumblr.com/post/41512778756/mysql
ただ、↑この辺りのurlによれば、mysqlInnoDBでは次のようです。

- ダーティ ファジー ファントム
READ UNCOMMITTED あり あり あり
READ COMMITTED - - あり
REPEATABLE READ - - - デフォルト
SERIALIZABLE - - -

と書いたものの、自身のmysqlの設定変更する前に、動作確認しましょう。

mysqlでの設定変更方法

http://dev.mysql.com/doc/refman/5.1/ja/innodb-transaction-isolation.html
my.cnfの[mysqld]セクションに記載するだけでOK

$ su -
# vi /etc/my.cnf
<略>
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake
default-storage-engine = INNODB
transaction-isolation = READ-COMMITTED
<略>