シリアライザブル隔離レベル

シリアライザブル レベルは,トランザクションの隔離と しては最も厳密なものです.トランザクションがこのレベルにある場合, 問い合わせが注目するのは,このトランザクションが開始される直前までに コミットされたデータのみであり,ダーティ・データも,トランザクションを 実行と同時に実行されている(別の)トランザクションがコミットした変更の 関与も一切ありません. つまり,このレベルが作り出そうとしているのは逐次的なトランザクションの 実行 − トランザクションが同時にではなく,あたかもひとつずつ順番に 実行されるように振舞うことです.

ふたたび UPDATE (または DELETESELECT FOR UPDATE )文を実行中に返された行を, 同時に実行されている,コミットされていないトランザクションが更新しようと しているとします.そのトランザクションは元のトランザクションが コミット,またはロールバックされるまで待ち状態に入ります. ロールバックがあった場合,待ち状態にあるトランザクションは行を 更新します.一方,コミットされた場合,シリアライザブルレベルに 設定されているトランザクションは以下のメッセージを出してロールバック します.

ERROR:  Can't serialize access due to concurrent update
(エラー:同時に実行されているトランザクションが更新をおこなったため,逐次アクセスができませんでした)
    
シリアライザブルレベルに設定されたトランザクションは,その トランザクションの開始以降に他のトランザクションが変更した行を 更新できないのです.

Note: SELECT ,(問い合わせつき) INSERT 文は,同時に実行されるトランザクションの影響を 受けません.