La transaction est l'un des mécanismes clés pour garantir la cohérence et l'intégrité des données lors de l'utilisation de PDO de PHP (objets de données PHP) pour les opérations de base de données. PDO :: BeginTransaction () est une méthode courante pour démarrer les transactions. De nombreux développeurs se demanderont quand ils sont débutants, qu'est-ce que cette fonction a à voir avec le soi-disant "mode AutoCommit"? Cet article explorera la connexion entre les deux en profondeur et l'analyse en détail à travers des exemples.
Dans la plupart des bases de données (telles que MySQL), par défaut, chaque instruction SQL exécutée indépendamment est exécutée en tant que transaction indépendante et engagée automatiquement. Ce comportement est appelé autocommit. En d'autres termes, si vous démarrez sans spécification une transaction, la base de données enregistrera immédiatement le résultat de l'opération après avoir exécuté une instruction INSERT , UPDATE ou DELETE .
Lorsque vous appelez PDO :: beginTransaction () , l'OPD désactivera automatiquement le mode automatique actuel et démarrera une nouvelle transaction. À l'heure actuelle, toutes les opérations d'écriture ultérieures de la base de données (telles que INSERT , UPDATE , DELETE ) ne seront pas soumises immédiatement jusqu'à ce que vous appeliez explicitement PDO :: commit () ou PDO :: rollback () . En d'autres termes, la fonction de cette fonction est de «désactiver la soumission automatique et d'activer la soumission manuelle».
Voici sa relation principale avec le modèle de soumission automatique:
Lorsque beginTransaction () n'est pas appelé : Soumettez-vous immédiatement après l'exécution de chaque instruction (le mode de soumission automatique est activé).
Après avoir appelé beginTransaction () : éteignez le mode de soumission automatique et entrez l'état de contrôle des transactions.
Il convient de noter qu'après l'exécution de la transaction (qu'il soit commit () ou rollback () ), PDO restaure généralement automatiquement la connexion au mode de validation automatique afin que les instructions suivantes puissent continuer à exécuter comme comportement par défaut.
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Démarrer une transaction,La soumission automatique est fermée
$pdo->beginTransaction();
// Insérer le premier enregistrement
$pdo->exec("INSERT INTO users (name, email) VALUES ('Alice', '[email protected]')");
// Insérer le deuxième enregistrement
$pdo->exec("INSERT INTO users (name, email) VALUES ('Bob', '[email protected]')");
// Soumettre les transactions
$pdo->commit();
echo "Les données ont été écrites avec succès。";
} catch (Exception $e) {
$pdo->rollBack(); // S'il y a une exception,Transactions en arrière
echo "Échec de la transaction:" . $e->getMessage();
}
?>
Dans le code ci-dessus, l'enregistrement inséré sera en fait écrit dans la base de données uniquement après que commit () sera appelé avec succès. Si une exception se produit à mi-chemin, l'appel Rollback () annulera toutes les modifications non engagées. L'ensemble du processus se produit lorsque le mode de soumission automatique est désactivé.
Vous pouvez observer les modifications du modèle de soumission automatique via des instructions SQL:
$pdo->query("SELECT @@autocommit")->fetchColumn(); // retour 1 Indique sur,0 Indique la proximité
Après avoir exécuté BeginTransaction () , l'exécution de la requête peut retourner 0, indiquant que la soumission automatique est fermée. Cet état durera jusqu'à la fin de la transaction.
Bien que dans certains pilotes, vous pouvez utiliser PDO :: SetAttribute () pour définir l'état de communication automatique, par exemple:
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
Mais cela n'est pas recommandé pour deux raisons:
Tous les conducteurs APD ne soutiennent pas cette propriété, et une mauvaise utilisation peut entraîner des problèmes de compatibilité;
Il est recommandé d'utiliser des API de transaction standard (c'est-à-dire beginTransaction () , commit () , rollback () ) pour gérer l'état de transaction pour garantir la cohérence multiplateforme.
La fonction de PDO :: beginTransaction () est de désactiver le mode de validation automatique et de gérer manuellement les transactions;
Le mode de validation automatique est activé par défaut lorsqu'aucune transaction n'est utilisée;
Une fois que commit () ou rollback () est appelé, la transaction se termine et les validations automatiques sont généralement reprise;
L'utilisation de transactions peut améliorer la sécurité et la cohérence des opérations de données, en particulier dans les scénarios où plusieurs opérations d'écriture doivent être "tout succès ou tous les échecs".
Comprendre la relation entre BeginTransaction () et la soumission automatique vous aidera à rédiger le code de fonctionnement de la base de données plus robuste et contrôlable. N'oubliez pas que les transactions ne sont pas des ennemis de la performance, mais le saint exactitude des données.