最近、ロック待ちにトランザクションが増え、結果としてサーバも負荷傾向にあるので、おさらい。
(ダーティ|ファジー|ファントム)リードの違い
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によれば、mysqlのInnoDBでは次のようです。
- | ダーティ | ファジー | ファントム | |
---|---|---|---|---|
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 <略>