2009-10-27 16 views
9

Lorsque dans une transaction mysql innodb, je voudrais attendre une erreur de clé en double pour provoquer une annulation. Ce n'est pas le cas, mais il lance simplement une erreur et continue à la commande suivante. Une fois la commande COMMIT atteinte, la transaction sera validée, sans la commande de la clé dupliquée.erreur de clé en double ne pas annuler/restauration transaction mysql

Est-ce le comportement attendu? Si oui, comment procéder pour le configurer de façon à ce que la transaction soit annulée au lieu d'être validée lorsqu'une telle erreur se produit?

environnement de test:

CREATE TABLE `test` ( 
    `id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

BEGIN; 
    INSERT INTO test VALUES (5); 
    INSERT INTO test VALUES (5); 
COMMIT; 

résultat escompté: table test est vide

résultat réel: table test contient un enregistrement avec une valeur 5

+0

Voir aussi: http://dev.mysql.com/doc/refman/5.0/en/innodb-error-handling. html –

Répondre

3

Vous devez déclarer un gestionnaire d'erreur qui annuler la transaction:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
BEGIN 
    ROLLBACK; 
    CALL ERROR_ROLLBACK_OCCURRED; 
END; 
8

Si un insert échoue en raison d'un duplicata, le base de données renvoie la transaction au début de cette instruction.

Elle utilise un point de sauvegarde interne défini au début de l'instruction, puis revient à ce point de sauvegarde.

Il ne recule pas la totalité de la transaction, car cela n'a peut-être pas été ce que vous vouliez.

Le comportement du client mysql est configurable en utilisant les paramètres de la ligne de commande. Il peut soit quitter (ce qui implicitement annuler) ou continuer.

Si vous utilisez votre propre application, ce que vous faites dépend de vous. Mysql n'impose pas POLICY sur la façon dont vous gérez les échecs - il laisse cela à votre application. Donc, ce que vous faites à leur sujet est votre propre affaire - vous pouvez les ignorer si vous le souhaitez. MySQL (et tout autre moteur sql AFAIK) n'annule pas automatiquement une transaction en cas d'erreur.

+2

Je veux vous donner 100 points de rep pour «Mysql n'impose pas de POLITIQUE sur la façon dont vous gérez les échecs - il laisse cela à votre application.Par conséquent, ce que vous faites à leur sujet est votre propre entreprise - vous pouvez les ignorer si vous voulez " – longneck

+0

Y a-t-il donc un moyen de configurer une transaction afin qu'elle revienne automatiquement sur une erreur de clé en double? ou dois-je surveiller le résultat de chaque requête, puis revenir en arrière pour obtenir ce comportement? – allixsenos

Questions connexes