2010-05-18 4 views
10

J'ai une table utilisateur, et j'ai 5 enregistrements.Rollback ne fonctionne pas dans MySQL

J'ai supprimé deux enregistrements, puis j'ai exécuté la commande rollback, qui s'est exécutée avec succès.

Mais cela a supprimé deux enregistrements non récupérés.

Le moteur de table utilisateur est InnoDB.

+0

Le titre de votre question est * très * puissant! On dirait que l'espagnol pour tous les gars de MySQL dopage lors du codage et que tous les utilisateurs finaux ont utilisé dopé db! * .. lol. MySQL DB est un grand homme! Vous ne pouvez pas simplement lancer une telle accusation :) –

Répondre

8

Vous devriez être en mesure de restaurer votre transaction en tant que moteur de table est InnoDB. enter image description here

Quoi qu'il en soit ici est la bonne façon de faire des transactions,

SET autocommit=0; 
START TRANSACTION; 
Your Query here. 
ROLLBACK; 

et assurez-vous que vous n'utilisez pas COMMIT Une fois la requête que vous devez rollback. Voir Table Engines et Transaction. Et lorsqu'une connexion DB est créée, elle est en mode de validation automatique par défaut. Cela signifie que chaque instruction SQL individuelle est traitée comme une transaction et est automatiquement validée juste après son exécution. Donc, si vous devez faire des transactions vous-même, vous devez désactiver le mode d'autocommit par AUTOCOMMIT = 0. Reportez-vous à link pour plus d'informations.

+0

J'utilise directement démarrer transac et rollback. mais je n'utilise pas SET autocommit = 0; . mais pour moi le retour de trasnaction a fonctionné. je voudrais connaître le but de ce SET autocommit = 0; – Bharanikumar

+1

@Bharanikumar: Lorsqu'une connexion DB est créée, elle est en mode de validation automatique par défaut. Cela signifie que chaque instruction SQL individuelle est traitée comme une transaction et est automatiquement validée juste après son exécution. Donc, si vous avez besoin de faire des transactions vous-même, vous devez désactiver le mode autocommit avec 'set AUTOCOMMIT = 0'. Consultez http://dev.mysql.com/doc/refman/5.0/en/innodb-implicit-commit.html –

+0

brève explication merci –

5
By default, MySQL starts the session 
for each new connection with 
autocommit enabled, 

Vous pouvez définir le mode de validation automatique désactiver avant de lancer votre requête

SET autocommit=0; 

ref:

Link 1

Link 2

+0

ne fonctionne pas .... pour moi ... j'ai essayé selon dev-mysql-support – Bharanikumar

2

Assurez-vous que vous faites déjà commande

start transaction; 

avant de supprimer la requête.

+0

aucune idée à ce sujet ... comment faire la commande démarrer la transaction. .. – Bharanikumar

0

J'ai le même problème, mais j'a vérifié le support InnoDB

Première: Vérifiez si le moteur InnoDB est disponible: avec ceci:

mysql> show engines; 

si InnoDB est désactivé: puis

Deuxième: aller dans le fichier "my.ini », dans mon cas est dans C: \ AppServ \ mysql dans ce fichier supprime le "#" de la ligne

#default-storage-engine=INNODB -> default-storage-engine=INNODB 

et la ligne skip-innodb add "#"

skip-innodb -> #skip-innodb 

Troisièmement:.. enregistrer et redémarrer le service mysql, et le problème a été résolu

2

Je ne sais pas si vous le verrouillage des tables, mais je suis tombé sur le même problème où il semblait que rollback ne fonctionnait pas

Dans ma transaction, j'ai appelé "LOCK TABLES ...", qui

engage implicitement toute transaction avant de tenter de verrouiller les tables

(http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html)

j'ai fini verrouillage à l'extérieur de (avant) la transaction, car c'était la première chose que je faisais dans la transaction de toute façon. Vous pouvez faire comme les documents suggèrent:

SET autocommit=0; 
LOCK TABLES t1 WRITE, t2 READ, ...; 
... do something with tables t1 and t2 here ... 
COMMIT; 
UNLOCK TABLES; 
0

Je pense qu'il ya une chose importante à mentionner: pour réactiver après validation automatique transaction est effectuée.

SET autocommit = 0; 
START TRANSACTION; 
    INSERT INTO .. 
    UPDATE <table> .. 
COMMIT; 
SET autocommit = 1; 

quoi que ce soit le cas contraire vous faites après la désactivation autocommit même sans transaction vous obliger à engager explicitement.

Questions connexes