5

我在一个项目中使用 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');

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

感谢您的帮助:dd

4

1 回答 1

9

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

pg_query 的文档

当多个语句被传递给函数时,它们会自动作为一个事务执行,除非查询字符串中包含显式的 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;")

于 2012-03-14T22:57:37.907 回答