Я испытываю странное поведение при попытке НЕ автоматическая фиксация вставок или обновлений в моем проекте 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.
Убедитесь, что вы не выполняете последующий оператор DDL (например, CREATE TABLE), так как это приведет к фиксации базы данных.
Других решений пока нет …