PHP Conference Nagoya 2025

oci_rollback

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

oci_rollbackRevierte la transacción pendiente de la base de datos

Descripción

oci_rollback(resource $connection): bool

Revierte todos los cambios no consignados para la conexión de Oracle dada por connection y finaliza la transacción. Libera todos los bloqueos existentes. Todos los SAVEPOINT de Oracle se eliminan.

Una transacción comienza cuando la primera sentencia SQL que modifica datos es ejecutada con oci_execute() usando la bandera OCI_NO_AUTO_COMMIT. Las modificaciones posteriores a datos realizadas por otras sentencias se convierten en parte de la misma transacción. Las modificaciones a datos hechas en una transacción son temporales hasta que ésta se consigna o revierte. Los demás usuarios de la base de datos no verán los cambios hasta que sean consignados.

Cuando se insertan o actualizan datos, se recomienda usar transacciones para mantener la consistencia de datos relacional y por razones rendimiento.

Parámetros

connection

Un identificador de conexión de Oracle, devuelto por oci_connect(), oci_pconnect() o oci_new_connect().

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Ejemplos

Ejemplo #1 Ejemplo de oci_rollback()

<?php

// Insertar en varias tablas, revirtiendo los cambios si ocurriera un error

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

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

// La bandera OCI_NO_AUTO_COMMIT le indica a Oracle que no consigne el INSERT inmediatamente
// Use OCI_DEFAULT como bandera para PHP <= 5.3.1. Las dos banderas son equivalentes
$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); // revertir los cambios de ambas tablas
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

// Consignar los cambios de ambas tablas
$r = oci_commit($conn);
if (!
r) {
$e = oci_error($conn);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

?>

Ejemplo #2 Ejemplo de reversión a un SAVEPOINT

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

// Crear el punto de prevención
$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);

// Usar una sentencia SQL explícita para volver al punto de prevención
$stid = oci_parse($conn, 'ROLLBACK TO SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

oci_commit($conn); // mytab ahora tiene el id 1111
?>

Notas

Nota:

Las transacciones son automáticamente revertidas cuando se cierra la conexión o cuando finaliza el script, lo que ocurra antes. Es necesario llamar explícitamente a oci_commit() para consignar la transacción.

Cualquier llamada a oci_execute() que use el modo OCI_COMMIT_ON_SUCCESS, explícitamente o por omisión, consignará cualquier transacción no consignada anteriormente.

Cualquier sentencia DDL de Oracle como CREATE o DROP consignará automáticamente cualquier transacción no consignada.

Ver también

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top