✨
トランザクション分離レベルの挙動を実験する
概要
- トランザクション分離レベルについて、実際の手を動かした実験の結果をメモする
- より詳細にはこちらの記事を参照
https://qiita.com/song_ss/items/38e514b05e9dabae3bdb#repeatable-read
環境
- MySQL 8.0.36
トランザクション分離レベルとは
- 複数のトランザクションが同時に走る時に、「どこまでお互いを見えなくするか」を決めるもの。
分離性に関する問題のまとめ
ダーティリード
- 別トランザクションの未コミットのデータを呼んでしまうこと
ファジーリード(ノン・リピータブルリード)
- 別トランザクションでコミットされた上で、同じ行を読み直したときに値が変わってしまうこと
ファントムリード
- 別トランザクションでコミットされた上で、同一条件で再検索したら行数が増減してしまうこと
- 所感
- 最初に勉強したときはファジーリードとファントムリードを概念として区別している理由がわからなかったが、新しいレコードが追加されたときはlockを効かせることができないため、複数のtransactionの整合性を取るときにファジーリードとは捉え方が異なることがわかった。
実験ログ
REPEATABLE-READ
の場合
まずはMySQLのデフォルト- ダーティリード、ファジーリード、ファントムリードが発生していない
- このトランザクション分離レベルの設定でファントムリードが発生しないのはMySQL独自の仕様の模様
READ-UNCOMMITTED
の場合
- ダーティリードが発生している
READ-COMMITTED
の場合
- ファジーリードが発生している
- ファントムリードが発生している
SERIALIZABLE
の場合
- すべての行にロックがかかる。ファジーリードもファントムリードも発生しない。
Discussion