PHP: драйвер PGSQL и AutoCommit? - PullRequest
5 голосов
/ 14 марта 2012

Я использую 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

1 Ответ

8 голосов
/ 15 марта 2012

Во-первых, в PostgreSQL нет режима AutoCommit, и функции PHP API pg_ * не пытаются эмулировать его.

pg_query's 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;")

...