我在项目中使用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
答案 0 :(得分:8)
首先,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;")