データベーススペシャリストの試験範囲である「トランザクションの隔離性水準」(ISOLATON LEVEL、分離レベル、隔離性レベル)、および、隔離性水準ごとに発生する整合性の異常(ダーティリード、ノンリピータブルリード、ファントムリード)について、記事にします。
隔離性水準の特性について
トランザクションの隔離性水準および特性は以下表の通りです。
| 隔離性水準 | 特性 |
|---|---|
| READ UNCOMMITTED (未コミット読み込み) | 分離レベルは最も低い。他のトランザクションで処理中のコミット前のデータを読み込んでしまうダーティリードが発生する可能性がある。ノンリピータブルリード、ファントムリードも発生する可能性がある。 |
| READ COMMITTED (コミット読み取り) | 他のトランザクションでコミットされたデータのみを読み取る。そのため、他のトランザクションでコミット前のデータを読み込むダーティリードは発生しない。ノンリピータブルリード(アンリピータブルリード)、ファントムリードは発生する可能性がある。 |
| REPEATABLE READ (反復読み出し可能) | 読み取り対象のデータを何度呼び出しても、同じ内容であることを保証する。あるトランザクションで読み取ったデータは、別のトランザクションで更新できなくなるため、ノンリピータブルリードは発生しない。ファントムリードは発生する可能性がある。 |
| SERIALIZABLE (直列化可能) | 必ず直列可能性が満たされるよう、トランザクションを同時実行制御する。トランザクションを複数並列で実行しても、順番に一つずつ実行したのと同じ結果になることを保証する。ダーティリード、ノンリピータブルリード、ファントムリードは発生しない。あるトランザクションが参照したテーブルには、追加、更新削除のいずれもできないため、データの整合性は最も高いが、排他待ちが起きやすくなり、スループットは一番悪くなる。 |
整合性異常について
ダーティリード
他のトランザクションで更新された『コミット前』データを読み込んでしまうことをダーティリードといいます。
そのままコミットされれば問題ないですが、その更新が取り消されると、存在しないデータで処理することとなり、整合性が損なわれます。

ダーティリードは、READ UNCOMMITTEDのみで発生する可能性があります。
ノンリピータブルリード(アンリピータブルリード)
同じデータを2回参照したときに値が変わってしまうことをノンリピータブルリードといいます。
1回目と2回目に参照する間に、他のトランザクションでデータが変更されて不整合が発生する可能性があります。
ファジーリードともいうこともあります。

ノンリピータブルリードは、READ UNCOMMITTED、READ COMMITTEDで発生する可能性があります。
ファントムリード
1回目と2回目の参照の間に、他のトランザクションによってデータが追加された場合、1回目にはなかったデータ(幻のデータ=ファントムデータ)が、2回目のときに参照されることをファントムリードといいます。

ファントムリードは、READ COMMITTED、READ UNCOMMITTED、REPEATABLE READで発生する可能性があります。
隔離性水準ごとの整合性異常の発生について
隔離水準ごとに発生する可能性がある整合性異常は以下表の通りです。
| 隔離性水準 | ダーティリード | ノンリピータブルリード | ファントムリード |
|---|---|---|---|
| READ UNCOMMITTED | 発生する | 発生する | 発生する |
| READ COMMITTED | 発生しない | 発生する | 発生する |
| REPEATABLE READ | 発生しない | 発生しない | 発生する |
| SERIALIZABLE | 発生しない | 発生しない | 発生しない |
以上、お読みいただきありがとうございました。