Maison >base de données >tutoriel mysql >Pourquoi ma procédure stockée MySQL échoue-t-elle après l'ajout de contrôles de transaction ?

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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-24 18:45:24644parcourir

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>

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>

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!

Déclaration:
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