2010-05-18 13 views
10

Mam tabelę użytkowników i mam 5 rekordów.Cofanie zmian nie działa w MySQL

Usunąłem dwa rekordy, a następnie wykonałem polecenie rollback, wykonane pomyślnie.

Ale to usunięto dwa rekordy nie odzyskane.

Silnik stołu użytkownika to InnoDB.

+0

Tytuł twojego pytania jest * bardzo * potężny! To brzmi jak język hiszpański, gdy * wszyscy faceci na MySQL dopingują podczas pisania kodu, a wszyscy użytkownicy końcowi używają doped db! * .. lol. MySQL DB to wielka sprawa! Nie możesz po prostu rzucić w to oskarżenia :) –

Odpowiedz

8

powinna być w stanie cofnąć transakcję jako silnik InnoDB jest stół. enter image description here

Anyways tutaj jest poprawny sposób to zrobić transakcje,

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

i upewnij się, że nie używasz COMMIT po Query które trzeba wycofać. Patrz Table Engines i . A gdy tworzone jest połączenie DB, domyślnie znajduje się ono w trybie automatycznego zatwierdzania. Oznacza to, że każda pojedyncza instrukcja SQL jest traktowana jako transakcja i jest automatycznie zatwierdzana zaraz po jej wykonaniu. Jeśli więc chcesz sam dokonać transakcji, musisz wyłączyć tryb automatycznego zatwierdzania przez AUTOCOMMIT = 0. Więcej informacji można znaleźć tutaj: link.

+0

Używam bezpośrednio rozpocząć transac i wycofać. ale nie używam polecenia autocommit SET = 0; . ale dla mnie działało wycofanie trasnaction. chciałbym znać cel tego autocommit SET = 0; – Bharanikumar

+1

@Bharanikumar: Po utworzeniu połączenia DB domyślnie jest ono w trybie automatycznego zatwierdzania. Oznacza to, że każda pojedyncza instrukcja SQL jest traktowana jako transakcja i jest automatycznie zatwierdzana zaraz po jej wykonaniu. Jeśli więc musisz sam wykonać transakcję, musisz wyłączyć tryb autocommit przez 'set AUTOCOMMIT = 0'. Więcej informacji można znaleźć na stronie http://dev.mysql.com/doc/refman/5.0/en/innodb-implicit-commit.html –

+0

dzięki –

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

Można ustawić automatyczne zatwierdzanie trybu wyłączyć przed uruchomieniem zapytanie

SET autocommit=0; 

ref:

Link 1

Link 2

+0

nie działa .... dla mnie ... próbowałem jak na dev-mysql-support – Bharanikumar

2

Upewnij się już wykonać polecenie

start transaction; 

przed kwerendy usunąć.

+0

nie mam pojęcia o tym ... jak zrobić polecenie rozpocznij transakcję. .. – Bharanikumar

0

Mam ten sam problem, ale sprawdziła wsparcia innodb

pierwsze: sprawdzić, czy InnoDB Engine jest dostępnych: z tego:

mysql> show engines; 

jeśli InnoDB jest wyłączona wówczas

Po drugie: przejdź do pliku "mój.ini”, w moim przypadku jest w C: \ AppServ \ mysql w tym pliku usuwa "#" linii

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

a linia skip-innodb Add "#"

skip-innodb -> #skip-innodb 

po trzecie:.. zapisać i ponownie uruchomić usługę mySQL, a problem został rozwiązany

2

ja nie wiem, czy były stoły blokowania, ale wpadłem na ten sam problem, gdzie wydawało się, wycofywania nie działa

ramach moich transakcji nazwałem "LOCK TABLES ...", który

pośrednio zobowiązuje każdą aktywną transakcję przed próbą zablokowania tabele

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

skończyło się blokowanie poza (przed) transakcją, ponieważ to była pierwsza rzecz, którą robiłem w transakcji. Alternatywnie, można to zrobić za docs sugerują:

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

Myślę, że jest jedna ważna rzecz mówiąc: ponowne włączenie trybu automatycznego po transakcja jest wykonywana.

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

Inaczej coś zrobić po wyłączeniu autocommit nawet bez transakcji będzie wymagać wyraźnie popełnić.