データベースはあまり詳しくないので、メモ書き。
SQL-92の仕様では、アイソレーションレベルというものがあり、READ_UNCOMMITTED, READ_COMMITED, REPAETABLE_READ, SERIALIZABLEという4つのレベルがあります。これを”SET TRANSACTION ISOLATION LEVEL”文で設定できます。これを設定することで、データベースからデータを読み込む際の挙動がかわります。
それぞれの意味は以下の通り。下にいくほど同時実効効率が悪くります。(NONEを除く)
アイソレーションレベル | トランザクションサポート | 不正な読み込み | ||
ダーティリード | ノンリピータブルリード | ファントムリード | ||
READ_UNCOMMITTED | ○ | 発生 | 発生 | 発生 |
READ_COMMITETED | ○ |
未発生 | 発生 | 発生 |
REPEATABLE_READ | ○ | 未発生 | 未発生 | 発生 |
SERIALIZABLE | ○ | 未発生 | 未発生 | 未発生 |
NONE | × |
発生 | 発生 | 発生 |
ここでの なんとかリードっていうのは以下のような意味です。
- ダーティリード
- トランザクションAとBがあって、Aが更新内容をコミットしていないのにBにはその内容が見えてしまうこと
- ノンリピータブルリード
- トランザクションAとBがあって、Aが更新している最中にBが複数回のSELECTをした場合に、複数回のSELECTの結果が違うこと
- ファントムリード
- トランザクションAとBがあって、Aがrowの追加・削除している最中にBが複数回のSELECTをした場合に、複数回のSELECTの結果が違うこと