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

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

dirty reads(ダーティ・リード)

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

non-repeatable reads(繰り返し不可能な読み出し)

トランザクションが過去に読み込んだデータをもう一度読み込もうとしたとき、 他のトランザクションによって書き換えられ、コミットされたデータを得てしまう。

phantom read(ファントム・リード)

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

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

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

Isolation Level(隔離レベル) Dirty Read(ダーティ・リード) 繰り返し不可能な読み出し Phantom Read(ファントム・リード)
Read uncommitted(コミットされていない読み込み) 可能 可能 可能
Read committed(コミットされた読み込み) 不可 可能 可能
Repeatable read(繰り返し可能な読み込み) 不可 不可 可能
Serializable(逐次化可能) 不可 不可 不可

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