ANSI/ISO SQL 規格は,同時に実行されるトランザクション間で防ぐべき三つの現象ごとに, トランザクション隔離のレベルを4レベルに分けて定義しています. 三つの望ましくない現象とは:
同時に実行されている,まだコミットされていないトランザクションが書き込んだ データを読み込んでしまう.
トランザクションが過去に読み込んだデータをもう一度読み込もうとしたとき, コミットされた他のトランザクションによって書き換えられたデータを得てしまう.
トランザクションが,ある行の集合を返す検索条件で問い合わせを再実行したとき, 他のコミットされたトランザクションが,その問い合わせ条件を満たしてしまう (以前は存在しなかった)行を挿入していた.
四つの隔離レベルと,対応する動作は以下のようになります.
Table 10-1. Postgres トランザクション隔離レベル
ダーティ・リード | 繰り返し不可能な読み込み | ファントム・リード | |
---|---|---|---|
リードアンコミッティド (コミットされていない読み込み) | 起こり得る | 起こり得る | 起こり得る |
リードコミッティド (コミットされた読み込み) | 起きない | 起こり得る | 起こり得る |
リピータブルリード (繰り返し可能な読み込み) | 起きない | 起きない | 起こり得る |
シリアライザブル (逐次化可能) | 起きない | 起きない | 起きない |