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.
Une analyse du code fourni a révélé deux erreurs syntaxiques :
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!