Maintenant que vous êtes connecté via PDO, avant de commencer à interroger, vous devez d'abord comprendre comment PDO gère les transactions.
Les transactions prennent en charge quatre caractéristiques principales (ACID) :
Atomicité
Cohérence
Isolement
Durabilité
En termes simples, toute opération effectuée dans le cadre d'une transaction, même si elle est effectuée par étapes, est garantie d'être appliquée en toute sécurité à la base de données et validée sans interférence d'autres connexions.
Les opérations de transaction peuvent également être automatiquement annulées sur demande (en supposant qu'elles n'ont pas encore été validées), ce qui facilite la gestion des erreurs dans les scripts.
Les transactions sont généralement mises en œuvre en « accumulant » un lot de modifications et en les rendant efficaces en même temps ; l'avantage de cette méthode est que cela peut grandement améliorer l'efficacité de ces modifications.
En d’autres termes, les transactions peuvent rendre les scripts plus rapides et potentiellement plus robustes (même si les transactions doivent être utilisées correctement pour bénéficier de tels avantages).
Malheureusement, toutes les bases de données ne prennent pas en charge les transactions, PDO doit donc s'exécuter en mode "autocommit" lors de la première ouverture de la connexion.
Le mode de validation automatique signifie que chaque exécution de requête possède sa propre transaction implicite si la base de données la prend en charge, ou aucune si la base de données ne prend pas en charge les transactions.
Si une transaction est requise, elle doit être démarrée avec la méthode PDO::beginTransaction(). Si le pilote sous-jacent ne prend pas en charge les transactions, une PDOException est levée (il s'agit d'une condition d'erreur grave quels que soient les paramètres de gestion des erreurs).
Une fois qu'une transaction est démarrée, elle peut être complétée avec PDO::commit() ou PDO::rollBack(), selon que le code de la transaction s'est exécuté avec succès.
Remarque : PDO vérifie uniquement s'il dispose de capacités de transaction au niveau du pilote. Si une condition d'exécution signifie qu'une transaction n'est pas disponible et que le service de base de données accepte une demande de démarrage d'une transaction, PDO::beginTransaction() retournera toujours TRUE sans erreur. Un bon exemple consiste à essayer d'utiliser des transactions dans une table MyISAM dans une base de données MySQL.
Lorsque le script se termine ou que la connexion est sur le point d'être fermée, s'il y a une transaction en cours, PDO annulera automatiquement la transaction. Cette mesure de sécurité permet d'éviter les incohérences si le script se termine de manière inattendue : si la transaction n'est pas validée explicitement, on suppose que quelque chose s'est mal passé, une restauration est donc effectuée pour protéger les données.
Remarque : la restauration automatique ne peut se produire qu'après le démarrage d'une transaction via PDO::beginTransaction(). Si vous émettez manuellement une requête pour démarrer une transaction, PDO n'a aucun moyen de le savoir et ne peut pas l'annuler si nécessaire.
Exécuter un traitement par lots dans une transaction :
Dans l'exemple suivant, supposons qu'un ensemble d'entrées soit créé pour un nouvel employé et qu'un ID de 23 lui soit attribué. En plus d'enregistrer les données de base de la personne, il est également nécessaire d'enregistrer son salaire.
Il est simple d'effectuer les deux mises à jour séparément, mais en les enfermant dans les appels PDO::beginTransaction() et PDO::commit(), vous vous assurez que personne d'autre ne peut voir les modifications tant qu'elles ne sont pas terminées.
Si une erreur se produit, le bloc catch annule toutes les modifications survenues depuis le démarrage de la transaction et imprime un message d'erreur.
<?phptry { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); echo "Connectedn";} catch (Exception $e) { die("Impossible de se connecter : " . $e->getMessage());}essayez { $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->beginTransaction(); $dbh->exec("insérer dans les valeurs du personnel (id, premier, dernier) (23, 'Joe ', 'Bloggs')"); $dbh->exec("insérer dans les valeurs de changement de salaire (id, montant, date de modification) (23, 50000, MAINTENANT())"); $dbh->commit(); } catch (Exception $e) { $dbh->rollBack(); echo "Échec : " . $e->getMessage();}?>
Vous n'êtes pas limité à apporter des modifications au sein d'une transaction, vous pouvez également émettre des requêtes complexes pour extraire des données, et vous pouvez utiliser ces informations pour créer davantage de modifications et de requêtes lorsque la transaction est active, vous pouvez garantir que d'autres ne peuvent pas apporter de modifications pendant la transaction ; l'opération est en cours.