Postgres でのデータ変更時の可視規則は 以下の通りです。問い合わせ実行中、その問い合わせ自身によって( SQL 関数、SPI 関数、トリガー経由で)なされたデータの変更は、その 問い合わせのスキャンに対して不可視となります。例えば、
INSERT INTO a SELECT * FROM aという問い合わせでは、挿入されたタプルは、SELECT スキャンに対して 不可視となります。このため、この問い合わせはデータベースのテーブルを 再帰処理することなく(もちろん、一意性インデックス規則に従って) 二重化します。
しかし、SPI 文書中の可視性に関する次の注意書きを覚えておいて下 さい。
問い合わせ Q によりなされる変更は、問い合わせ Q の後に開始した問 い合わせに対しては可視です。この問い合わせが Q の内側で( Q の実 行中に)開始されたのか、Q の実行が終ってから開始されたのかについ ては問いません。
当然のことですが、挿入されるタプル( tg_trigtuple )は BEFORE トリガー中の問い合わせに対しては不可視となります。AFTER トリガ ー中の問い合わせに対してはこの(挿入されたばかりの)タプルは可 視に、そして、その後の BEFORE/AFTER トリガー中の問い合わせでは 可視になります!