16.3. 資料改變的可視性

PostgreSQL 資料修改的可視性規則:在查詢執行過程中, 由查詢本身造成的資料修改 (通過 SQL-函數,SPI-函數,觸發器)對查詢掃描而言是不可見的. 例如,在查詢

INSERT INTO a SELECT * FROM a;

裡,插入的元組對 SELECT 的掃描是不可見的.實際上, 這麼做在資料庫內部形成非遞歸的資料庫表的復制 (當然是要受到唯一索引規則的制約的).

但是請記住在 SPI 文擋裡關於可視性的註釋:

由查詢 Q 造成的改變可以為查詢 Q 以後運行的查詢可見,不管這些查詢 是在查詢 Q 內部開始運行(在 Q 運行期間)的還是Q運行完畢後開始運行的.

這些對觸發器而言也是正確的,盡管被插入的元組 (tg_trigtuple)對 BEFORE 觸發器是不可見的, 這個剛被插入的元組卻可以被一個 AFTER 觸發器看到, 並且對所有這個(觸發器)以後的所有 BEFORE/AFTER 觸發器均可見!