oci_rollback

(PHP 5, PHP 7, 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($stidOCI_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($stidOCI_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($stidOCI_NO_AUTO_COMMIT);

// Crear el punto de prevención
$stid oci_parse($conn'SAVEPOINT mysavepoint');
oci_execute($stidOCI_NO_AUTO_COMMIT);

$stid oci_parse($conn'UPDATE mytab SET id = 2222');
oci_execute($stidOCI_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($stidOCI_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