codecamp

PostgreSQL 数据改变的可见性

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

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

    INSERT INTO a SELECT * FROM a;
    

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

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

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

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

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

PostgreSQL SPI_start_transaction
PostgreSQL 例子
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

PostgreSQL SQL语言

PostgreSQL 服务器管理

PostgreSQL 客户端接口

PostgreSQL 服务器编程

PostgreSQL 参考

PostgreSQL 内部

PostgreSQL 附录

PostgreSQL 参考书目

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }