データ変更時の可視性

Postgres でのデータ変更時の可視規則は 以下の通りです。問い合わせ実行中、その問い合わせ自身によって( SQL 関数、SPI 関数、トリガー経由で)なされたデータの変更は、その 問い合わせのスキャンに対して不可視となります。例えば、

   INSERT INTO a SELECT * FROM a
という問い合わせでは、挿入されたタプルは、SELECT スキャンに対して 不可視となります。このため、この問い合わせはデータベースのテーブルを 再帰処理することなく(もちろん、一意性インデックス規則に従って) 二重化します。

しかし、SPI 文書中の可視性に関する次の注意書きを覚えておいて下 さい。

   問い合わせ Q によりなされる変更は、問い合わせ Q の後に開始した問
   い合わせに対しては可視です。この問い合わせが Q の内側で( Q の実
   行中に)開始されたのか、Q の実行が終ってから開始されたのかについ
   ては問いません。

当然のことですが、挿入されるタプル( tg_trigtuple )は BEFORE トリガー中の問い合わせに対しては不可視となります。AFTER トリガ ー中の問い合わせに対してはこの(挿入されたばかりの)タプルは可 視に、そして、その後の BEFORE/AFTER トリガー中の問い合わせでは 可視になります!