トランザクション分離レベルの挙動を実験する

に公開

概要

環境

  • MySQL 8.0.36

トランザクション分離レベルとは

  • 複数のトランザクションが同時に走る時に、「どこまでお互いを見えなくするか」を決めるもの。

分離性に関する問題のまとめ

ダーティリード

  • 別トランザクションの未コミットのデータを呼んでしまうこと

ファジーリード(ノン・リピータブルリード)

  • 別トランザクションでコミットされた上で、同じ行を読み直したときに値が変わってしまうこと

ファントムリード

  • 別トランザクションでコミットされた上で、同一条件で再検索したら行数が増減してしまうこと
  • 所感
    • 最初に勉強したときはファジーリードとファントムリードを概念として区別している理由がわからなかったが、新しいレコードが追加されたときはlockを効かせることができないため、複数のtransactionの整合性を取るときにファジーリードとは捉え方が異なることがわかった。

実験ログ

まずはMySQLのデフォルトREPEATABLE-READの場合

  • ダーティリード、ファジーリード、ファントムリードが発生していない
    • このトランザクション分離レベルの設定でファントムリードが発生しないのはMySQL独自の仕様の模様


READ-UNCOMMITTEDの場合

  • ダーティリードが発生している

READ-COMMITTEDの場合

  • ファジーリードが発生している

  • ファントムリードが発生している

SERIALIZABLEの場合

  • すべての行にロックがかかる。ファジーリードもファントムリードも発生しない。



Discussion