(PHP 5, PECL OCI8 >= 1.1.0)
oci_rollback — Annule les transactions Oracle en cours
$connection
)
Annule toutes les modifications non validées pour une
connexion connection
Oracle
et met fin à la transaction courante. Tous les verrous seront
également libérés. Tous les points de sauvegarde Oracle
(SAVEPOINTS) seront supprimés.
Une transaction commence lorsque la première requête SQL
qui modifie des données est exécuté avec la fonction
oci_execute() en utilisant le drapeau
OCI_NO_AUTO_COMMIT
. Les modifications suivantes
effectuées par d'autres requêtes deviennent partie intégrante de la
même transaction. Les modifications effectuées lors d'une transaction sont
temporaires tant que la transaction n'a pas été validée ou annulée.
Les autres utilisateurs de la base de données ne verront ces modifications
que lors de la validation de la transaction.
Lors de l'insertion ou de la mise à jour de données, l'utilisation des transactions est fortement recommandée afin de garantir la consistence relationnelle des données, mais aussi pour des raisons de performance.
connection
Un identifiant de connexion Oracle, retourné par la fonction oci_connect(), oci_pconnect() ou oci_new_connect().
Cette fonction retourne TRUE
en cas de
succès ou FALSE
si une erreur survient.
Exemple #1 Exemple avec oci_rollback()
<?php
// Insertion dans plusieurs tables, puis, annulation des modifications si des erreurs surviennent
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
$stid = oci_parse($conn, "INSERT INTO mysalary (id, name) VALUES (1, 'Chris')");
// Le drapeau OCI_NO_AUTO_COMMIT indique à Oracle de ne pas valider l'insertion immédiatement.
// Utilisez le drapeau OCI_DEFAULT en PHP <= 5.3.1. Les 2 sont identiques.
$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); // Annulation des modifications sur les 2 tables
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
// Validation des modifications sur les 2 tables
$r = oci_commit($conn);
if (!r) {
$e = oci_error($conn);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
?>
Exemple #2 Exemple de retour à un point de sauvegarde (SAVEPOINT)
<?php
$stid = oci_parse($conn, 'UPDATE mytab SET id = 1111');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
// création du point de sauvegarde
$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);
// utilise une requête SQL explicite pour effectuer le retour au point de sauvegarde
$stid = oci_parse($conn, 'ROLLBACK TO SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
oci_commit($conn); // mytab a maintenant un id de 1111
?>
Note:
Les transactions sont automatiquement annulées lorsque vous fermez la connexion, ou lorsque le script se termine, un des deux arrivant le premier. Vous devez explicitement appeler la fonction oci_commit() pour valider la connexion.
Tous les appels à la fonction oci_execute() qui utilisent le mode
OCI_COMMIT_ON_SUCCESS
, qui se soit par défaut ou de façon explicite, valideront toutes les transactions en attente.Toutes les requêtes Oracle comme CREATE ou DROP valideront également, automatiquement, toutes les transactions en attente.