9.2. トランザクションの隔離

ANSI/ISO SQL規格は、 同時に実行されるトランザクション間で防ぐべき3つの現象ごとに、 トランザクション隔離のレベルを4レベルに分けて定義しています。 3つの望ましくない現象とは下記のものです。

ダーティ読み取り(dirty reads)

同時に実行されている他のトランザクションが書き込んだ、まだコミットされていない データを読み込んでしまう。

反復不能読み取り(non-repeatable reads)

トランザクションが、以前読み込んだデータを再度読み込む際、そのデータを 別のトランザクションが更新しコミットしたことによって、以前のデータではなく、 新しいデータを得てしまう。

ファントム(phantom read)

トランザクションが、ある行の集合を返す検索条件で問い合わせを再実行したとき、 別のトランザクションがその問い合わせ条件を満たす行を変更し、コミット してしまったために、同じ検索条件で問い合わせを実行しても異る結果を得てしまう。

4つの隔離レベルと対応する動作は下記のようになります。

Table 9-1. ANSI/ISO SQL隔離レベル

隔離レベル ダーティ読み取り 反復不能読み取り ファントム
Read uncommitted(コミットされていない読み取り) 可能性あり 可能性あり 可能性あり
Read committed(コミットされた読み取り) 安全 可能性あり 可能性あり
Repeatable read(繰り返し可能な読み取り) 安全 安全 可能性あり
Serializable(シリアライザブル) 安全 安全 安全

Postgresは「read committed」と 「serializable」の2つの隔離レベルを備えています。