PostgreSQL 9.3.1 中文手册 | ||||
---|---|---|---|---|
上一页 | 上一级 | 章 44. 服务器编程接口 | 下一页 |
下面规则决定使用 SPI(或者任何其它 C 函数)的函数里面的数据修改的可视性:
在一个 SQL 命令执行期间,任何这个命令做的数据改变都是命令本身所看不到的。 比如,在下面命令里:
INSERT INTO a SELECT * FROM a;
插入的行是SELECT部分看不到的。
命令 C 做的修改可以被 C 之后开始的所有命令看到,不管他们是在 C 里面 (在执行 C 期间)还是在 C 完成后开始的。
一个命令,如果是在一个 SQL 命令调用的函数(普通函数或者是触发器)里通过 SPI 执行的, 那么它遵循上面两个规则之一,具体哪个取决于传递给 SPI 的读/写标志。 以只读模式执行的命令遵循第一条规则:它们看不见调用它的命令做的修改。 以读写模式执行的规则遵循第二条规则:它们可以看到迄今为止所做的所有改变。
所有标准的过程语言都根据函数的易失性属性设置 SPI 读写模式。STABLE 和IMMUTABLE函数是以只读模式设置的,而VOLATILE 函数是以读写模式设置的。虽然其它 C 函数可以违反这个规定,但是这么做不是好事。
下一节里包含一些例子,演示了这些规则的应用。