首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PGSQL驱动程序和AutoCommit?

PGSQL驱动程序和AutoCommit?
EN

Stack Overflow用户
提问于 2012-03-14 23:05:25
回答 1查看 3.6K关注 0票数 5

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

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

另一个有趣的问题是在执行后提交( pg_query A commit )吗?

例如:

代码语言:javascript
复制
pg_query('begin; update table1...; update table2...; commit');

等同于

代码语言:javascript
复制
pg_query('begin;');
pg_query('update table1...;');
pg_query('update table2...;');
pg_query('commit');

,并且是

代码语言:javascript
复制
pg_query('begin; update table1...; update table2...; commit');

在AutoCommit模式下工作,那么begin和commit呢?

感谢您的帮助: dd

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-15 06:57:38

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

pg_query的doc

将多个语句传递给函数时,除非查询字符串中包含显式的BEGIN/COMMIT命令,否则这些语句将作为一个事务自动执行

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

该序列

代码语言:javascript
复制
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;")

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9704557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档