oci8 — автоматическая фиксация PHP OCI при использовании OCI_NO_AUTO_COMMIT в oci_execute

Я испытываю странное поведение при попытке НЕ автоматическая фиксация вставок или обновлений в моем проекте php с использованием oci_* функции.

Согласно документации запросы на вставку и обновление должны не быть совершенным, когда сценарий заканчивается, если только oci_commit функция называется:

Использование режима OCI_NO_AUTO_COMMIT запускает или продолжает транзакцию. Транзакции автоматически откатываются при закрытии соединения или при завершении скрипта. Явно вызовите oci_commit (), чтобы зафиксировать транзакцию, или oci_rollback (), чтобы прервать ее.

При вставке или обновлении данных рекомендуется использовать транзакции для согласованности реляционных данных и из соображений производительности.

Если режим OCI_NO_AUTO_COMMIT используется для любого оператора, включая запросы, и oci_commit () или oci_rollback () впоследствии не вызывается, то OCI8 выполнит откат в конце сценария, даже если данные не были изменены. Чтобы избежать ненужного отката, многие сценарии не используют режим OCI_NO_AUTO_COMMIT для запросов или PL / SQL. Будьте внимательны, чтобы обеспечить соответствующую транзакционную согласованность для приложения при использовании oci_execute () с разными режимами в одном и том же сценарии.

Когда я выполняю запрос INSERT с OCI_NO_AUTO_COMMIT в качестве второго параметра в oci_execute функция, а затем вызвать oci_rollback Функция до завершения сценария, данные не фиксируются — как и ожидалось. Но, если я делаю ту же процедуру и не вызываю oci_rollback функция (ни oci_commit функция) до завершения сценария, данные фиксируются. Что мне не хватает? Я неправильно понимаю документацию?

Следующий код фиксирует вставку, что не соответствует ожиданиям.

$sqlString  = "INSERT INTO table1 (col1) VALUES ('test')";
$stid = oci_parse($dbConnection, $sqlString);
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);

ПРИМЕЧАНИЕ. Проект работает под управлением PHP7 и OCI8.

1

Решение

Убедитесь, что вы не выполняете последующий оператор DDL (например, CREATE TABLE), так как это приведет к фиксации базы данных.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector