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 ?

19
demandé sur Tohid 2013-09-16 00:25:42

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.
  1. sqlexception
  2. 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
$$
40
répondu Nisar 2013-11-18 10:57:59

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;
4
répondu Bill Karwin 2013-09-15 21:46:22

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
4
répondu Rahul Tripathi 2013-09-16 15:57:21