Position actuelle: Accueil> Derniers articles> Pourquoi la transaction échoue-t-elle mais renvoie 0 lors de l'utilisation de mysqli :: $ errno? De quelles autres fonctions avez-vous besoin pour combiner pour diagnostiquer le problème?

Pourquoi la transaction échoue-t-elle mais renvoie 0 lors de l'utilisation de mysqli :: $ errno? De quelles autres fonctions avez-vous besoin pour combiner pour diagnostiquer le problème?

M66 2025-06-23

Dans les opérations de base de données PHP, l'extension MySQLI est le moyen le plus utilisé pour connecter et faire fonctionner les bases de données MySQL. Dans de nombreux scénarios, nous utilisons des transactions pour assurer l'atomicité des opérations de base de données. Cependant, parfois, lorsque vous utilisez MySqli :: $ Errno pour le diagnostic d'erreur, vous pouvez rencontrer une situation déroutante: même si la transaction échoue, MySqli :: $ Errno renvoie 0, ce qui nous rend difficile de diagnostiquer le problème.

Codes de transaction et d'erreur

Tout d'abord, nous devons comprendre comment fonctionne mysqli :: $ errno . MySQLI :: $ Errno renverra le code d'erreur pour la dernière opération de base de données. Lorsque l'opération réussit, sa valeur est de 0; Lorsque l'opération échoue, il renvoie un code d'erreur non nul. Le problème, cependant, est que certaines opérations de base de données (en particulier celles impliquant des transactions) ne mettent pas toujours à jour directement MySqli :: $ Errno , et même si l'opération échoue, elle peut ne pas produire de code d'erreur significatif.

La transaction a échoué mais a renvoyé 0

Si vous rencontrez des problèmes à l'aide de transactions et constatez que même si la transaction échoue, MySqli :: $ Errno est toujours 0, ce qui ne signifie pas qu'aucune erreur ne s'est produite. En fait, l'opération de transaction elle-même ne peut pas envoyer un code d'erreur directement. Par exemple, lorsque vous utilisez mysqli :: begin_transaction () ou mysqli :: commit () , si la base de données elle-même ne détecte pas une erreur grave, elle peut ne pas renvoyer un code d'erreur, mais simplement marquer la transaction comme "échoué".

Ce phénomène se produit généralement dans les situations suivantes:

  1. Mode de validation automatique: Si MySQLI :: $ Auto_Commit est défini sur true dans la transaction, l'opération de transaction peut être automatiquement engagée et il n'y a pas de retour explicite même en cas d'erreur.

  2. Les erreurs SQL n'apparaissent pas: certaines erreurs (telles que les erreurs de contrainte de données) peuvent ne pas être immédiatement reflétées dans mysqli :: $ errno , en particulier lorsque les erreurs de base de données sont supprimées.

Diagnostiquer les problèmes avec d'autres fonctions

Si mysqli :: $ errno renvoie 0 et que vous soupçonnez que l'opération de transaction échoue, vous pouvez combiner les fonctions suivantes pour diagnostiquer le problème:

  1. MySqli :: $ Erreur :
    MySQLI :: $ Erreur renvoie un message d'erreur pour l'opération de base de données. Lorsque mysqli :: $ errno est 0, la vérification de l'erreur mysqli :: $ peut vous aider à obtenir des informations d'erreur plus détaillées. Même sans code d'erreur explicite, le message d'erreur de la base de données peut toujours exister en tant que chaîne.

     if ($mysqli->errno) {
        echo "Error: " . $mysqli->error;
    }
    
  2. mysqli :: error_list :
    Pour MySQL Version 5.5+, MySQLI :: ERROR_LIST fournit une liste d'erreurs qui vous permet d'obtenir des informations d'erreur plus détaillées, y compris plusieurs causes d'erreur, ce qui est particulièrement utile lorsque les transactions sont complexes.

     $errors = $mysqli->error_list;
    foreach ($errors as $error) {
        echo "Error code: " . $error['errno'] . " - " . $error['error'];
    }
    
  3. mysqli :: rollback () :
    Si vous rencontrez un problème d'échec de la transaction, vous pouvez appeler explicitement Rollback () lorsque la transaction échoue et reculer la transaction avec des informations d'erreur pour analyser le problème. Cela peut éviter les incohérences de données causées par des commits de transaction incomplètes.

     $mysqli->rollback();
    echo "Transaction failed, rolled back.";
    
  4. Afficher le statut InNODB du moteur :
    Il s'agit d'une commande intégrée dans MySQL pour obtenir les informations d'état du moteur InNODB. En interrogeant cette commande, vous pouvez voir des informations détaillées liées à la transaction, notamment une impasse, une attente de verrouillage et d'autres problèmes. Vous pouvez exécuter cette commande via mysqli :: query () pour obtenir plus d'indices.

     $result = $mysqli->query("SHOW ENGINE INNODB STATUS");
    $status = $result->fetch_assoc();
    echo $status['Status'];
    
  5. Afficher le journal de la base de données:
    Dans certains cas, le journal d'erreur de la base de données peut fournir des informations plus utiles, surtout si certaines erreurs de transaction sous-jacentes ne peuvent pas être obtenues via le code d'erreur renvoyé par PHP. Vous pouvez vérifier les fichiers journaux d'erreur MySQL ou utiliser un outil tel que PhpMyAdmin pour afficher ces journaux.

Résumer

Lorsque vous utilisez MySqli :: $ Errno , une défaillance des transactions mais les renvoie 0 peuvent être dus à diverses raisons, y compris le mode de validation automatique, une défaillance d'erreur SQL, etc. Afin de diagnostiquer plus précisément les problèmes de défaillance des transactions, nous pouvons combiner d'autres fonctions et méthodes telles que MySQLI :: $ Erreur , MySQLI :: ERROR_LIST , Afficher le statut de moteur InnodB pour analyser la cause racine de la cause racine. Assurez-vous de gérer les opérations de démarrage, de validation et de recul avec prudence pour garantir la cohérence des données.