MySql procédures stockées, les transactions et les restaurations
Je ne peux pas trouver une façon optimale d'utiliser les transactions dans une base de données MySql Procédure Stockée. Je veux ROLLBACK
si quelque chose échoue:
BEGIN
SET autocommit=0;
START TRANSACTION;
DELETE FROM customers;
INSERT INTO customers VALUES(100);
INSERT INTO customers VALUES('wrong type');
COMMIT;
END
1) Est autocommit=0
nécessaire?
2) Si le deuxième INSERT
des pauses (et il le fait bien sûr) la première INSERT
n'est pas annulée. La procédure continue simplement vers le bas pour le COMMIT
. Comment puis-je éviter cela?
3) j'ai trouvé que je peux DECLARE HANDLER
, devrais-je utiliser cette instruction ou est-il un moyen plus simple de dire que si une commande échoue, la procédure stockée doit ROLLBACK
et aussi échouer?
DECLARE HANDLER
fonctionne très bien, mais depuis j'ai la version de MySql 5.1 je ne peux pas utiliser RESIGNAL
. Donc, si une erreur se produit, l'appelant ne sera pas notifié:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
-- RESIGNAL; not in my version :(
END;
START TRANSACTION;
OriginalL'auteur vulkanino | 2010-09-29
Vous devez vous connecter pour publier un commentaire.
Réponse 1: Vous n'avez pas besoin de set autocommit=0
http://dev.mysql.com/doc/refman/5.6/en/commit.html
To disable autocommit mode implicitly for a single series of statements, use the START TRANSACTION statement
OriginalL'auteur Fabien
Approche différente de la Réponse 2: Vous pouvez utiliser une variable booléenne pour savoir si l'on doit COMMIT ou ROLLBACK. Par exemple:
Ou, vous pouvez utiliser votre très utile 3)
OriginalL'auteur KGs