Le concept de base d'une transaction est "Soit tous réussir ou tous échouent". Si une opération dans la transaction échoue, toutes les opérations de la transaction seront annulées (révoquées). Les transactions contiennent généralement les quatre caractéristiques suivantes (principe acide):
Atomicité : toutes les opérations d'une transaction sont terminées ou non terminées.
Cohérence : une transaction doit faire passer la base de données d'un état cohérent à un autre.
Isolement : L'exécution d'une transaction ne doit pas être perturbée par d'autres transactions.
Durabilité : Une fois la transaction engagée, les données doivent être permanentes et ne seront pas perdues.
Dans les bases de données MySQL, les transactions reposent principalement sur le moteur de stockage InnoDB car InnODB prend en charge les transactions, tandis que d'autres moteurs de stockage tels que Myisam ne le font pas.
Dans PHP, la fonction MySQLI :: Begin_transaction est utilisée pour démarrer explicitement une transaction. Après avoir appelé cette fonction, MySQL lancera une transaction sans soumettre ou faire reculer les données immédiatement jusqu'à ce que le développeur appelle explicitement Commit () ou Rollback () .
<span><span>mysqli::</span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><span>();
</span></span>
La fonction n'a pas de paramètres et la valeur de retour est vide , c'est-à-dire aucun résultat n'est renvoyé. Il est principalement utilisé pour démarrer les transactions, après quoi vous pouvez effectuer une série d'opérations de base de données.
Connexion à la base de données : Tout d'abord, vous devez établir une connexion de base de données via MySQLI_Connect ou une méthode orientée objet.
Démarrez une transaction : appelez begin_transaction pour démarrer la transaction.
Effectuez des opérations SQL : effectuez une série d'opérations SQL dans une transaction, telles que l'insertion, la mise à jour ou la suppression de données.
COMMISSER ou ROLLACK : décidez de commettre ou de randonner en fonction du résultat d'exécution.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Créer une connexion</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);
</span><span><span class="hljs-comment">// Vérifiez la connexion</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Échec de la connexion: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// Démarrer une transaction</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><span>();
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-comment">// mettre en œuvre SQL fonctionner</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (name, email) VALUES ('Alice', '[email protected]')"</span></span><span>);
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"UPDATE users SET email = '[email protected]' WHERE name = 'Bob'"</span></span><span>);
</span><span><span class="hljs-comment">// S'il n'y a pas d'erreur,Soumettre les transactions</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Soumission de transaction réussie!"</span></span><span>;
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-comment">// Si une erreur se produit,Transactions en arrière</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rollback</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Rollback des transactions: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-comment">// Fermer la connexion</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
La gestion des erreurs est critique lors de l'utilisation des transactions. Nous prenons généralement des exceptions via l'instruction TRY-Catch et faisons reculer la transaction lorsqu'une erreur se produit. Cela garantit que même si une opération échoue au milieu, toutes les opérations précédentes seront révoquées et la cohérence de la base de données sera maintenue.
Dans le code ci-dessus, en supposant qu'une erreur se produit lors de l'exécution des opérations SQL (telles que les conflits de contraintes de base de données), le bloc de capture attrapera cette erreur et rétablira toutes les opérations de base de données via $ mysqli-> rollback () .
Transaction de commit : lorsque toutes les opérations de la transaction sont exécutées avec succès, la méthode commit () peut être appelée pour soumettre la transaction, ce qui signifie que toutes les modifications seront enregistrées en permanence dans la base de données.
Rollback : Si une erreur se produit dans la transaction, appelez la méthode Rollback () pour révoquer toutes les opérations SQL effectuées avant et restaurer la base de données à l'état avant le début de la transaction.
La validation et le retour sont la clé du contrôle des transactions et déterminent le résultat final de la transaction.
<span><span><span class="hljs-comment">// Soumettre les transactions</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
</span><span><span class="hljs-comment">// Transactions en arrière</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rollback</span></span><span>();
</span></span>
Mode de soumission automatique : MySQL active le mode de soumission automatique par défaut, c'est-à-dire que chaque instruction SQL sera soumise immédiatement après son exécution. Si vous souhaitez utiliser des transactions, vous devez désactiver manuellement le mode AutoCommit. La soumission automatique peut être désactivée via MySqli-> AutoCommit (FALSE) .
Exemple:
<span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">autocommit</span></span><span>(</span><span><span class="hljs-literal">FALSE</span></span><span>); </span><span><span class="hljs-comment">// Désactiver la soumission automatique</span></span><span>
</span></span>
Nidification des transactions : MySQL ne prend pas en charge les transactions imbriquées réelles. Si vous démarrez une autre transaction dans une transaction, le commit ou le retour d'une transaction interne n'affectera pas la transaction externe.
Étiquettes associées:
mysqli