Transactions avec PDO

Transactions et validation automatique (auto-commit)

Maintenant que vous êtes connecté via PDO, vous devez comprendre comment PDO gère les transactions avant d’exécuter des requêtes. Si vous n’avez jamais utilisé les transactions, elles offrent 4 fonctionnalités majeures: Atomicité, Cohérence, Isolation et Durabilité (ACID). En d’autres termes, tout travail effectué dans une transaction, même si elle est effectuée par étapes, est garanti d’être appliqué à la base de données sans risque et sans interférence avec d’autres connexions, quand il est commis. Le travail des transactions peut également être automatiquement annulé à votre demande (à condition que vous ne l’ayez pas déjà commis), rendant ainsi le traitement des erreurs dans vos scripts plus facile.

Les transactions sont implémentées pour appliquer toutes vos modifications en une seule fois, ce qui a pour effet d’améliorer considérablement l’efficacité de ces mises à jour. En d’autres termes, les transactions rendent vos scripts plus rapides et potentiellement plus robustes (vous devez les utiliser correctement pour en tirer le maximum d’avantages).

Malheureusement, toutes les bases de données ne supportent pas les transactions, donc PDO doit s’exécuter en ce qui est connu comme « auto-commit » dès lors que vous ouvrez la connexion. Le mode auto-commit signifie que chaque requête que vous exécutez a ses propres transactions implicites , si la base de données les supporte ou aucune transaction si la base de données ne les supporte pas. Si vous avez besoin d’une transaction, vous devez utiliser la méthode PDO:: beginTransaction ()pour l’initialiser. Si le pilote ne supporte pas les transactions, une exception PDO sera lancée (indépendamment de votre gestionnaire d’erreurs: ceci est toujours une erreur sérieuse). Une fois que vous êtes dans une transaction, vous pouvez utiliser la fonction PDO:: commit () ou PDO->rollback () pour la terminer, suivant le succès de votre code lors de la transaction.

Lorsque le script se termine ou lorsque la connexion est sur le point d’être fermée, si vous avez une transaction en cours, PDO l’annulera automatiquement. Il s’agit d’une mesure de sécurité pour éviter les incohérences dans les cas où le script se termine de manière inattendue – si vous n’avez pas validé explicitement la transaction, il est supposé que quelque chose s’est mal passé, la transaction est annulée afin de garantir la sécurité de vos données.

Avertissement
L’annulation automatique intervient si vous avez initialisé la transaction via PDO:: beginTransaction (). Si vous avez manuellement exécuté une requête qui déclenche une transaction, PDO n’a aucun moyen de le savoir et ne peut donc pas annuler cette transaction si celle-ci s’est mal passée.

Exemple#5 Executing a batch in a transaction

Dans l’exemple suivant, supposons que nous créons un jeu d’entrées pour un nouvel employé, à qui a été attribué un numéro d’identification de 23. En plus de l’entrée dans la base de données de la personne, nous avons également besoin d’enregistrer son salaire. Il est très simple d’effectuer deux mises à jour, mais en les enfermant dans les PDO:: beginTransaction () et PDO:: commit (), nous garantissons que personne d’autre ne sera capable de voir ces modifications tant qu’elles n’auront été complètées. Si quelque chose se passe mal, le bloc de capture annulera toutes les modifications effectuées depuis le début de la transaction et affichera un message d’erreur.

try {

$dbh = new PDO(‘odbc:SAMPLE’, ’db2inst1′, ’ibmdb2′,

array(PDO::ATTR_PERSISTENT => true));

echo  »Connected\n »;

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$dbh->beginTransaction();

$dbh->exec(« insert into staff (id, first, last) values (23, ’Joe’, ’Bloggs’) »);

$dbh->exec(« insert into salarychange (id, amount, changedate)

values (23, 50000, NOW()) »);

$dbh->commit();

} catch (Exception $e) {

$dbh->rollBack();

echo  »Failed:  » . $e->getMessage();

}

Vous n’êtes pas limité à faire des mises à jour dans une transaction, vous pouvez également effectuer des requêtes complexes pour extraire des données, et éventuellement utiliser ces informations pour construire d’autres mises à jour ainsi que d’autres requêtes. Pendant que la transaction est en cours, vous êtes garanti que personne d’autre ne peut faire de changements en plein milieu de votre travail. En vérité, cela n’est pas vrai à 100%, mais c’est une introduction largement suffisante si vous n’avez jamais entendu parler de transactions.