トランザクション分離レベル
「待ち時間を減らすためどれだけデータの一貫性を犠牲にして良いか」を定めたもの
アプリケーションの性質によってどこまで許容するか変わる
分離レベルが高い(SERIALIZABLE が最も高い)ほどRDBMSの処理に時間がかかる
「全部SERIALIZABLEにすればいい」となることはない
どれぐらい遅いの?
table:InnoDbである分離レベルの時に発生するかどうか
命名がややこしいので毎回わからなくなる。こう覚えるとスッキリする
dirty readはuncommitedなものを読んでしまう→分離レベルread commitedで防げる
fuzzy readはcommitedだが更新されると読んでしまう(複数回読んだ時に途中で更新されるとnon repeatableになる)→分離レベル repeatable readで何度読んでも同じになる
ロックのタイミング
https://gyazo.com/aecec0d719ef9285737bbbb52c5622fa
Read Uncommitted
Readロック: すぐに解放
他のトランザクションの未コミットデータも読めるため、ロックは基本的に不要。
Writeロック: トランザクションコミット後
書き込みが終わるまでデータの一貫性を保つ必要がある。
問題: ダーティリード。未コミットのデータが読まれる。
Read Committed
Readロック: 読み取り操作後すぐに解放
コミット済みのデータしか読まないので、読み終わったらロックを解放。
Writeロック: トランザクションコミット後
書き込みが終わるまでデータの一貫性を保つ必要がある。
問題: ノンリピータブルリード。同じデータが異なる値になる。
Repeatable Read
Readロック: トランザクション終了時まで保持
トランザクション中のデータの状態を一貫して保つ。
Writeロック: トランザクションコミット後
書き込みが終わるまでデータの一貫性を保つ必要がある。
問題: ファントムリード。同じ条件の新しいレコードが見える。
Serializable
Readロック: トランザクション終了時まで保持
他のトランザクションと干渉しないように。
Writeロック: トランザクションコミット後
書き込みが終わるまでデータの一貫性を保つ必要がある。
問題: パフォーマンス低下。非常に厳格な制約のため。
資料
図がわかりやすい
The reason why InnoDB use REPEATABLE READ as its default is historical. This is a related to the way MySQL replication was developed . MySQL replication until 5.1 functioned with a statement based replication mechanism. This means that statements that occurs on the master server are replayed on the slave server. The statement base replication mode does not permit to use the READ COMMITTED isolation level. In that case replication will not guaranty consistency between the slave and the master.
批判
もっと明確にできるいう論文
疑問
ファントムリードはなぜ起こる?
リソース