历史版本。 PostgreSQL 7.3 已结束支持。 请参阅 当前版本手册.
16.3. 数据更改的可见性 #
PostgreSQL 的数据更改可见性规则:在一次查询执行期间,该查询自身(通过 SQL 函数、SPI 函数、触发器)所做的数据更改对查询扫描是不可见的。例如,在查询
INSERT INTO a SELECT * FROM a;
中,被插入的元组对 SELECT 扫描不可见。其效果是在数据库表内部复制该表自身(当然要受唯一索引规则的约束),而不会递归。
但请记住 SPI 文档中关于可见性的这段说明:
查询 Q 所做的更改,对所有在查询 Q 之后启动的查询都可见,无论这些查询是在 Q 内部(即 Q 执行期间)启动,还是在 Q 完成之后启动。
这对触发器同样成立,因此,虽然正在被插入的元组(tg_trigtuple)对 BEFORE 触发器中的查询不可见,但这个元组(刚刚插入的)对 AFTER 触发器中的查询可见,也对在此之后触发的 BEFORE/AFTER 触发器中的查询可见!