PostgreSQL 数据改变的可见性

2021-09-06 10:59 更新

下列规则主导了使用 SPI 的函数(或者任何其他 C 函数)中数据改变 的可见性:

  • 在一个 SQL 命令的执行期间,该命令所作的任何数据更改对该命令本身 是不可见的。例如,在

    INSERT INTO a SELECT * FROM a;
    

    中,被插入的行对SELECT部分不可见。

  • 一个命令 C 所作的更改对所有在 C 之后开始的命令可见,不管它们是否 在 C 之中(在 C 的执行期间)开始还是在 C 完成之后开始。

  • 在一个 SQL 命令(或者一个普通函数或者触发器)调用的函数内通过 SPI 执行的命令遵循以上哪条规则取决于传递给 SPI 的读/写标志。以 只读模式执行的命令遵循第一条规则:它们不能看到调用它们的命令的 改变。在读写模式中执行的命令遵循第二条规则:它们能看见目前为止 所有的改变。

  • 所有的标准过程语言会基于函数的易变性属性设置 SPI 读写模式。 STABLEIMMUTABLE函数的命令会以 只读模式完成,而VOLATILE函数的命令会以读写模式 完成。虽然 C 函数的作者可以违反这种习惯,但是最好不要那样做。

下一节包含一个关于这些规则应用的例子:

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号