分離レベル
ANSI により定義
非コミット読み取り(Read Uncommitted)
トランザクションどうしがまったく独立してない分離レベル
トランザクションは他のトランザクションが行った変更を、コミットされる前であっても、見ることが可能
ダーティリード
コミット済み読み取り(READ COMMITTED)
ほとんどのデータベースのデフォルト
他のトランザクションがコミットした変更だけを見ることが可能
同じ SELECT 文を 2 回実行すると、その間に別のトランザクションがコミットを行った場合にその結果が見えてしまう(UPDATE の実行が見える)
ノンリピータブルリード
ファジーリード
再読み込み可能読み込み(Repeatable Read)
トランザクション内で同じ SELECT を実行すると、常に同じ結果になることが保証されている分離レベル
ノンリピータブルリード は防ぐことが可能だが、あるトランザクションを読み込んだとき、選択できるデータが現れたり消えたりする現象( ファントムリード : INSERT されたデータが見える) が起きるとされる
InnoDB の REPEATABLE-READ では、ネクストキーロック という仕組みがあるためファントムリードは起こらない
InnoDB のデフォルトの分離レベル
直列化可能(Serializable)
実際には並列で実行されたトランザクションが、時間的な重なりがない状態でコミットされた順序で実行すると、実際に実行されたものと同じ実行結果になるということが保証される分離レベル
直列化可能
InnoDB の SERIALIZABLE では、参照した行に対して自動的に共有ロック(LOCK IN SHARE MODE) がかけられる
ロストアップデートを防ぐことが可能
table:summary
Read ダーティリード ファジーリード ファントムリード
READ UNCOMMITTED 発生 発生 発生
READ COMMITTED 発生しない 発生 発生
REPEATABLE READ 発生しない 発生しない 発生
SERIALIZABLE 発生しない 発生しない 発生しない
参照
ソシャゲエンジニアの自分が開発に必須だなと思った知識(MySQL編)
#DB