Maison > base de données > tutoriel mysql > le corps du texte

Pourquoi ma procédure stockée MySQL échoue-t-elle après l'ajout de contrôles de transaction ?

Linda Hamilton
Libérer: 2024-10-24 18:45:24
original
549 Les gens l'ont consulté

Why is My MySQL Stored Procedure Failing After Adding Transaction Controls?

Dépannage des transactions dans les procédures stockées MySQL

Modifier une procédure stockée pour qu'elle soit transactionnelle devrait être simple, mais les détails techniques provoquent souvent des obstacles. Un utilisateur a rencontré un tel problème lorsque sa procédure s'est comportée de manière erratique après l'ajout de contrôles de transaction.

L'extrait de code problématique fourni par l'utilisateur est reproduit ci-dessous :

<code class="sql">BEGIN

DECLARE poid INT;

DECLARE EXIT HANDLER FOR SQLEXCEPTION SQLWARNING
BEGIN
    ROLLBACK;
END

START TRANSACTION;

    -- ADD option 5
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0);
    SET poid = (SELECT LAST_INSERT_ID());
    INSERT INTO product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,price_prefix,points,points_prefix,weight,weight_prefix) VALUES(poid,insertedProductID,5,50,0,0,4.99,'+',0,'+',0,'+');

    -- ADD option 12
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1);

    -- ADD option 13
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,13,0);

COMMIT;

END</code>
Copier après la connexion

L'utilisateur a souligné que la procédure fonctionnait parfaitement avant l'introduction des contrôles de transactions, mais par la suite, cela a empêché même la tâche de base de sauvegarder les modifications. L'utilisateur a parcouru la documentation MySQL et les ressources en ligne, mais aucune erreur apparente n'a pu être détectée.

Résolution du problème

Une analyse du code fourni a révélé deux erreurs syntaxiques :

  1. L'instruction DECLARE EXIT HANDLER doit avoir des virgules entre les exceptions SQL spécifiées. La documentation MySQL mentionne explicitement cette exigence.
  2. Le bloc BEGIN...END de EXIT HANDLER doit se terminer par un point-virgule, car il s'agit d'une instruction distincte et nécessite une terminaison appropriée.

Pour résoudre le problème, l'instruction DECLARE EXIT HANDLER doit être modifiée comme suit :

<code class="sql">DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
    ROLLBACK;
END;</code>
Copier après la connexion

Avec ces corrections, la procédure stockée devrait implémenter avec succès la transactionnalité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!