(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_rollback — Revierte la transacción pendiente de la base de datos
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.
connection
Un identificador de conexión de Oracle, devuelto por oci_connect(), oci_pconnect() o oci_new_connect().
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
?>
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
oDROP
consignará automáticamente cualquier transacción no consignada.