2017-02-16 2 views
1

Je rencontre un comportement étrange lors d'une tentative de PAS auto commit insertions ou des mises à jour dans mon projet PHP en utilisant les fonctions oci_*.auto PHP OCI commis lors de l'utilisation OCI_NO_AUTO_COMMIT dans oci_execute

According to the documentation l'insert et les requêtes de mise à jour ne devrait pas être engagés lorsque le script se termine, à moins que la fonction oci_commit est appelée:

Utilisation du mode OCI_NO_AUTO_COMMIT démarre ou poursuit une transaction. Les transactions sont automatiquement annulées lorsque la connexion est fermée ou lorsque le script se termine. Appelez explicitement oci_commit() pour valider une transaction, ou oci_rollback() pour l'annuler. Lorsque vous insérez ou mettez à jour des données, l'utilisation de transactions est recommandée pour la cohérence des données relationnelles et pour des raisons de performances. Si le mode OCI_NO_AUTO_COMMIT est utilisé pour toute requête incluant des requêtes, et si oci_commit() ou oci_rollback() n'est pas appelé par la suite, alors OCI8 effectuera une restauration à la fin du script même si aucune donnée n'a été modifiée. Pour éviter une annulation inutile, de nombreux scripts n'utilisent pas le mode OCI_NO_AUTO_COMMIT pour les requêtes ou PL/SQL. Veillez à assurer la cohérence transactionnelle appropriée pour l'application lors de l'utilisation de oci_execute() avec différents modes dans le même script.

Lorsque j'effectue une requête INSERT avec OCI_NO_AUTO_COMMIT comme second paramètre dans la fonction oci_execute, et appeler ensuite la fonction oci_rollback avant la fin du script, les données ne sont pas engagés - comme prévu. Mais, si je fais la même procédure et n'appelle pas la fonction oci_rollback (ni la fonction oci_commit) avant la fin du script, les données sont validées. Qu'est-ce que je rate? Ai-je mal compris la documentation?

Le code suivant valide l'insertion, ce qui n'est pas ce que j'attends.

$sqlString = "INSERT INTO table1 (col1) VALUES ('test')"; 
$stid = oci_parse($dbConnection, $sqlString); 
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT); 

REMARQUE: Le projet exécute PHP7 et OCI8.

+0

Je ne peux pas le repro en utilisant 'PHP/7.0.15',' OCI8/2.1.3', 'InstantClient/12.1.0.2.0' (tout' x64' sur Windows 10) en l'insérant dans un serveur 11gR2. Le fait d'ajouter ou de supprimer simplement le paramètre 'OCI_NO_AUTO_COMMIT' provoque le comportement documenté (commit ou rollback). – timclutton

Répondre

0

Vérifiez que vous n'exécutez pas une instruction DDL ultérieure (telle que CREATE TABLE) car cela déclenchera une validation par la base de données.