PHP 8.4.0 RC4 available for testing

oci_rollback

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_rollbackОткатывает транзакции, ожидающие обработки

Описание

oci_rollback(resource $connection): bool

Данная функция откатывает все незафиксированные изменения соединения Oracle connection и завершает транзакцию. Она также освобождает все установленные блокировки. Удаляются все Oracle SAVEPOINTS.

Транзакция начинается при первом SQL-запросе, изменяющим данные, который был запущен с помощью функции oci_execute() и флага OCI_NO_AUTO_COMMIT. Последующие изменения данных от других запросов также становятся частью данной транзакции. Изменения, сделанные в транзакции, являются временными до тех пор, пока транзакция не будет зафиксирована или будет произведён её откат. Другие пользователи базы данных не смогут увидеть изменения до их фиксации.

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

Список параметров

connection

Идентификатор соединения Oracle, полученный из функций oci_connect(), oci_pconnect() или oci_new_connect().

Возвращаемые значения

Функция возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования oci_rollback()

<?php

// Вставка в несколько таблиц, откат изменений в случае возникновения ошибки

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, "INSERT INTO mysalary (id, name) VALUES (1, 'Chris')");

// Флаг OCI_NO_AUTO_COMMIT сообщает Oracle не фиксировать запрос INSERT при его поступлении
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!
$r) {
$e = oci_error($stid);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$stid = oci_parse($conn, 'INSERT INTO myschedule (startday) VALUES (12)');
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!
$r) {
$e = oci_error($stid);
oci_rollback($conn); // откат изменений из обоих таблиц
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

// Фиксация изменений в обоих таблицах
$r = oci_commit($conn);
if (!
r) {
$e = oci_error($conn);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

?>

Пример #2 Пример использования отката до SAVEPOINT

<?php
$stid
= oci_parse($conn, 'UPDATE mytab SET id = 1111');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

// Создаём точку сохранения
$stid = oci_parse($conn, 'SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

$stid = oci_parse($conn, 'UPDATE mytab SET id = 2222');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

// Явно используем SQL-запрос для отката к точке сохранения
$stid = oci_parse($conn, 'ROLLBACK TO SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

oci_commit($conn); // mytab теперь содержит id равные 1111
?>

Примечания

Замечание:

Транзакции будут автоматически откачены при закрытии соединения или окончании скрипта (в зависимости от того, что случится раньше). Для фиксации транзакции необходимо явно вызвать функцию oci_commit().

Все вызовы oci_execute(), явно или по умолчанию использующие режим OCI_COMMIT_ON_SUCCESS зафиксируют любую предыдущую незафиксированную транзакцию.

Любой DDL-запрос Oracle, такой как CREATE или DROP автоматически фиксирует любую незафиксированную транзакцию.

Смотрите также

  • oci_commit() - Подтверждает транзакцию базы данных
  • oci_execute() - Выполняет подготовленное выражение

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top