【问题标题】:PHP: PGSQL driver and AutoCommit?PHP:PGSQL 驱动程序和自动提交?
【发布时间】:2012-03-14 15:05:25
【问题描述】:

我在一个项目中使用 pg_connect 和 pg_query。 但是我真的不确定pg_connect是否使用AutoCommit模式?

这是一个很重要的问题,因为我需要在事务下写一些块,如果其中一个语句会被服务器忽略,数据库就会不一致......

还有一个有趣的问题是执行后执行 pg_query 提交吗?

例如:

pg_query('begin; update table1...; update table2...; commit');

相同
pg_query('begin;');
pg_query('update table1...;');
pg_query('update table2...;');
pg_query('commit');

并且是

pg_query('begin; update table1...; update table2...; commit');

在自动提交模式下工作,所以开始和提交仍然是?

感谢您的帮助: dd

【问题讨论】:

    标签: php postgresql transactions autocommit


    【解决方案1】:

    首先,PostgreSQL 中没有 AutoCommit 模式,PHP API 的 pg_* 函数不会尝试模拟。

    pg_query 的 doc

    当多个语句传递给函数时,它们是 作为一个事务自动执行,除非有明确的 查询字符串中包含的 BEGIN/COMMIT 命令

    因此它保证pg_query("UPDATE1 ..; UPDATE2...") 在一个事务中执行,并对数据产生全有或全无影响。

    顺序

    pg_query("BEGIN");
    pg_query("UPDATE1...");
    pg_query("UPDATE2..");
    pg_query("COMMIT");
    

    在数据完整性方面等同于pg_query("UPDATE1 ..; UPDATE2...")(不会出现半完成状态)。

    关于“除非有显式的BEGIN/COMMIT...”的注释,只有当它们不在整个SQL语句链的开头和结尾时才有意义。 也就是说,pg_query("BEGIN; update1; update2; COMMIT;"); 等同于 pg_query("update1; update2;") 但(显然)不等同于 pg_query("update1; COMMIT; update2;")

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多