ANSI/ISO SQL規格は、 同時に実行されるトランザクション間で防ぐべき三つの現象ごとに、 トランザクション隔離のレベルを4レベルに分けて定義しています。 三つの望ましくない現象とは下記のものです。
同時に実行されている、まだコミットされていないトランザクションが 書き込んだデータを読み込んでしまう。
トランザクションが過去に読み込んだデータをもう一度読み込もうとしたとき、 他のトランザクションによって書き換えられ、コミットされたデータを得てしまう。
トランザクションが、ある行の集合を返す検索条件で問い合わせを再実行したとき、 別のトランザクションがその問い合わせ条件を満たす行を変更し、コミット してしまった。
四つの隔離レベルと対応する動作は下記のようになります。
Table 9-1. ANSI/ISO SQL隔離レベル
Isolation Level(隔離レベル) | Dirty Read(ダーティ・リード) | 繰り返し可能な読み込み | Phantom Read(ファントム・リード) |
---|---|---|---|
コミットされていない読み込み | 可能 | 可能 | 可能 |
コミットされた読み込み | 不可 | 可能 | 可能 |
繰り返し可能な読み込み | 不可 | 不可 | 可能 |
逐次化可能 | 不可 | 不可 | 不可 |
Postgresは「コミットされた読み込み」レベルと 「逐次化可能」レベルの2つの隔離レベルを備えています。