PostgreSQL 数据改变的可见性
下列规则主导了使用 SPI 的函数(或者任何其他 C 函数)中数据改变 的可见性:
-
在一个 SQL 命令的执行期间,该命令所作的任何数据更改对该命令本身 是不可见的。例如,在
INSERT INTO a SELECT * FROM a;
中,被插入的行对
SELECT
部分不可见。 -
一个命令 C 所作的更改对所有在 C 之后开始的命令可见,不管它们是否 在 C 之中(在 C 的执行期间)开始还是在 C 完成之后开始。
-
在一个 SQL 命令(或者一个普通函数或者触发器)调用的函数内通过 SPI 执行的命令遵循以上哪条规则取决于传递给 SPI 的读/写标志。以 只读模式执行的命令遵循第一条规则:它们不能看到调用它们的命令的 改变。在读写模式中执行的命令遵循第二条规则:它们能看见目前为止 所有的改变。
-
所有的标准过程语言会基于函数的易变性属性设置 SPI 读写模式。
STABLE
和IMMUTABLE
函数的命令会以 只读模式完成,而VOLATILE
函数的命令会以读写模式 完成。虽然 C 函数的作者可以违反这种习惯,但是最好不要那样做。
下一节包含一个关于这些规则应用的例子: