2017-02-16 6 views
1

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

According to the documentation вставки и обновления запросов должны не быть совершено, когда заканчивается сценарий, если функция 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.

+0

Я не могу воспроизвести это с помощью 'PHP/7.0.15',' OCI8/2.1.3', 'InstantClient/12.1.0.2.0' (все' x64' в Windows 10), вставляя их на сервер 11gR2. Простое добавление или удаление параметра 'OCI_NO_AUTO_COMMIT' приводит к возникновению документального поведения (фиксация или откат). – timclutton

ответ

0

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