Comment puis-je utiliser des transactions dans ma procédure stockée MySQL?
j'essaie de modifier ma procédure stockée MySQL et de la rendre transactionnelle. La procédure stockée existante fonctionne très bien sans problème, mais dès que je la rends transactionnelle, elle ne me permet même pas de sauvegarder mes modifications. J'ai vérifié la documentation MySQL et j'ai cherché en ligne mais je ne trouve aucun problème avec mon code. Il semble être assez simple, mais ne peut pas le comprendre.
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
une idée ?
3 réponses
Transaction en MySQL Procédure Stockée
Pour effectuer le ROLLBACK dans la procédure stockée MySQL, nous devons déclarer handler de sortie dans la procédure stockée. il y a deux types de handler que nous pouvons avoir dans la procédure stockée MySQL.- sqlexception
- sqlwarning
sqlexception va exécuter lorsqu'il y a une erreur lors de l'exécution de la requête et sqlwarning va exécutez quand un avertissement se produit dans la procédure stockée MySQL. Voyons comment on peut avoir ces blocs dans la procédure stockée.
DELIMITER $$
CREATE PROCEDURE `transaction_sp` ()
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
ROLLBACK;
END;
DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
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
$$
Deux erreurs de syntaxe:
vous avez besoin de virgules entre les conditions pour votre gestionnaire de sortie. Avis de la documentation syntaxique indique les virgules.
vous devez résilier le
END
du gestionnaire de sortie avec un point-virgule.DECLARE
déclaration elle-même (y compris son début...END block) est une instruction comme une autre, et doit avoir un terminator.
Si vous avez besoin de ceci:
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
ROLLBACK;
END;
essayez comme ceci ie, incluez votre Declare
déclaration à l'intérieur de l' START TRANSACTION;
. Plus tôt votre ROLLBACK
ne faisait pas partie de TRANSACTION
comme vous l'avez écrit au-dessus de l' START TRANSACTION
: -
BEGIN
START TRANSACTION;
DECLARE poid INT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN
ROLLBACK;
END
-- 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