PHP Affaires PDO et auto-commit
Maintenant, connecté via PDO est allé en avant le début de la requête, vous devez d'abord comprendre comment PDO est de gérer les affaires.
Support des transactions quatre propriétés (ACID):
- Atomicité (atomicité)
- Cohérence (cohérence)
- Isolation (Isolation)
- Persistent (durabilité)
Plus simplement, toutes les opérations effectuées dans une transaction, même une mise en œuvre progressive, mais aussi pour garantir la sécurité appliquée à la base de données, et ne sera pas soumis à des interférences de temps à partir d'autres connexions.
les opérations de transaction peuvent également être automatiquement révoqués sur demande (en supposant pas encore soumis), ce qui le rend plus facile à gérer les erreurs dans un script.
La transaction se fait habituellement par un certain nombre de changements «économies» et laisse ensuite entrer en vigueur et mis en œuvre, les avantages de le faire est de fournir l'efficacité de ceux-ci peut être considérablement modifié.
En d'autres termes, les transactions peuvent rendre vos scripts plus rapides et potentiellement plus robustes (vous devez toujours les utiliser correctement pour récolter cet avantage).
Malheureusement, chaque base de données prend en charge les transactions, de sorte que lorsque vous ouvrez la connexion, PDO exige que l'on appelle "auto-commit" mode de fonctionnement.
Auto-commit en mode signifie que si le support de base de données, chaque exécution de la requête a sa propre transaction implicite, si la base de données ne supporte pas les transactions, non.
Si vous avez besoin d'une opération, vous devez utiliser la méthode PDO :: beginTransaction () pour démarrer. Si le conducteur sous-jacent ne supporte pas les transactions, jetez un PDOException d'exception (quel que soit le type de paramètres de gestion des erreurs, ceci est une condition d'erreur grave).
Une fois que la transaction est disponible PDO :: commit () ou PDO :: rollback () pour terminer, selon le code de transaction est en cours d'exécution avec succès.
Remarque: AOP seulement si la capacité de traitement des transactions à l'inspection de la couche de conducteur. Si une condition d'exécution signifie que la transaction ne sont pas disponibles, et le service de base de données accepte une demande d'ouverture de la transaction, PDO :: beginTransaction () retournera toujours TRUE et aucune erreur. Essayez d'utiliser la transaction est un bon exemple dans les tables base de données MySQL MyISAM.
Lorsque le script est terminé ou que la connexion est sur le point d'être fermé, s'il n'y a pas une transaction terminée, PDO sera automatiquement annuler la transaction. Cette mesure de sécurité permet d'éviter des incohérences dans le script se termine de manière inattendue - sinon engager explicitement la transaction, l'hypothèse est fausse quelque part, de sorte que la restauration est effectuée pour assurer la sécurité des données.
Remarque: commencer Seule une transaction PDO :: beginTransaction () plus tard, il peut arriver automatiquement annulée. Si vous avez manuellement une requête pour démarrer une transaction, le PDO ne peut pas savoir, de sorte que, le cas échéant, ne peut pas être annulée.
Dans une opération batch d'exécution:
Dans l'exemple suivant, supposons que vous créez un ensemble d'entrées pour les nouveaux employés, leur attribuer un identifiant 23 est. En plus des données de base de la personne de l'enregistrement, mais aussi vous devez enregistrer son salaire.
Les deux mises à jour sont terminées, il est très simple, mais en fermant le PDO :: beginTransaction () et PDO :: commit () appel, il est possible de faire en sorte que, avant les changements, d'autres personnes ne peuvent pas voir ces changements.
Si une erreur se produit, la prise bloquer tous les changements depuis la transaction a été annulée depuis le début, et délivre un message d'erreur.
<?php try { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); echo "Connected\n"; } catch (Exception $e) { die("Unable to connect: " . $e->getMessage()); } try { $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(); } ?>
Ne se limite pas à des changements dans la transaction, il peut émettre des requêtes complexes pour extraire des données, mais aussi de construire plus de changements et requête en utilisant cette information, lorsque la transaction est active, vous pouvez vous assurer que les autres ne peuvent pas faire des changements dans l'opération en cours.