Я использую pg_connect и pg_query в проекте. Но я действительно не уверен, что это pg_connect, используя режим AutoCommit или нет?
Это важный вопрос, потому что мне нужно написать какой-то блок по транзакции, и если один из операторов будет проигнорирован сервером, база данных будет непоследовательной …
Также интересный вопрос, который делает pg_query commit после выполнения?
Например:
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
Во-первых, в PostgreSQL нет режима AutoCommit, а функции pg_ * PHP API не пытаются имитировать.
Документ pg_query сообщает
Когда несколько операторов передаются функции, они автоматически выполняются как одна транзакция, если в строке запроса не указаны явные команды BEGIN / COMMIT
Поэтому он гарантирует, что pg_query("UPDATE1 ..; UPDATE2...")
выполняется в одной транзакции и оказывает на данные все или ничего.
Последовательность
pg_query("BEGIN"); pg_query("UPDATE1..."); pg_query("UPDATE2.."); pg_query("COMMIT");
эквивалентно pg_query("UPDATE1 ..; UPDATE2...")
отношении целостности данных ( pg_query("UPDATE1 ..; UPDATE2...")
состояние не может быть выполнено).
Что касается примечания «если нет явного BEGIN / COMMIT …», это имеет значение только в том случае, если они не находятся в начале и конце всей цепочки операторов SQL. То есть pg_query("BEGIN; update1; update2; COMMIT;");
эквивалентно pg_query("update1; update2;")
но (очевидно) не эквивалентен pg_query("update1; COMMIT; update2;")