ANSI/ISO SQL規格は、 同時に実行されるトランザクション間で防ぐべき3つの現象ごとに、 トランザクション隔離のレベルを4レベルに分けて定義しています。 3つの望ましくない現象とは下記のものです。
同時に実行されている他のトランザクションが書き込んだ、まだコミットされていない データを読み込んでしまう。
トランザクションが、以前読み込んだデータを再度読み込む際、そのデータを 別のトランザクションが更新しコミットしたことによって、以前のデータではなく、 新しいデータを得てしまう。
トランザクションが、ある行の集合を返す検索条件で問い合わせを再実行したとき、 別のトランザクションがその問い合わせ条件を満たす行を変更し、コミット してしまったために、同じ検索条件で問い合わせを実行しても異る結果を得てしまう。
4つの隔離レベルと対応する動作は下記のようになります。
Table 9-1. ANSI/ISO SQL隔離レベル
隔離レベル | ダーティ読み取り | 反復不能読み取り | ファントム |
---|---|---|---|
Read uncommitted(コミットされていない読み取り) | 可能性あり | 可能性あり | 可能性あり |
Read committed(コミットされた読み取り) | 安全 | 可能性あり | 可能性あり |
Repeatable read(繰り返し可能な読み取り) | 安全 | 安全 | 可能性あり |
Serializable(シリアライザブル) | 安全 | 安全 | 安全 |
Postgresは「read committed」と 「serializable」の2つの隔離レベルを備えています。