PHP:PGSQL 驱动程序和 AutoCommit?

标签 php postgresql transactions autocommit

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

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

执行后执行 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

最佳答案

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

pg_query 的 doc

When multiple statements are passed to the function, they are automatically executed as one transaction, unless there are explicit BEGIN/COMMIT commands included in the query string

因此它保证 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;")

关于PHP:PGSQL 驱动程序和 AutoCommit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9704557/

相关文章:

macos - 如何在 mac os x 10.8.2 上重置 postgresql 9.2 默认用户(通常为 'postgres' )密码?

mysql - MySQL 数据库事务是否会破坏使用 RefreshDatabase 或 DatabaseTransactions 的 Laravel PHPUnit 测试?

ruby-on-rails - Rails 事务不会因验证错误而回滚

mongodb - 为什么MongoDB没有事务? (v4.0 之前)

php - 具有多个具有相同名称的查询字符串参数的 Symfony HttpClient GET 请求

php - 为什么sql无法执行插入查询?

postgresql - 名称冲突时如何优先使用表名而不是列(在 postgres 中)

sql - FILTER 中不允许使用聚合函数

php - 从 mysqli 语句结果返回关联数组

PHP 对表格中的文件进行排序