Nasza aplikacja uruchamia zapytanie INSERT do bazy danych MySQL w celu dodania rekordów. Chcę wiedzieć, czy rekordy są automatycznie zatwierdzane. Jeśli uruchomię polecenie ROLLBACK, kiedy baza danych wykona wycofanie? Czy ROLLBACK jest możliwy po zatwierdzeniu?
13
Odpowiedzi:
Odpowiedź na twoje pytanie zależy od tego, czy jesteś w transakcji, która obejmuje więcej niż jedno oświadczenie. (Oznaczono to pytanie InnoDB, odpowiedź byłaby inna w przypadku MyISAM).
Z podręcznika: http://dev.mysql.com/doc/refman/5.1/en/commit.html
Tak, domyślnie, jeśli tylko używasz
INSERT
, wstawiane rekordy zostaną zatwierdzone i nie ma sensu próbować ich przywracać. (Jest to w rzeczywistości to samo, co zawijanie każdej instrukcji pomiędzyBEGIN
iCOMMIT
.)Jeśli jednak masz do czynienia z transakcjami w sposób jawny, będziesz musiał użyć,
COMMIT
aby zatwierdzić przechowywanie zapisów, ale będziesz również mógł z nich korzystaćROLLBACK
.Możesz jawnie rozpocząć transakcję, używając
START TRANSACTION
(lubBEGIN
). Jest to niezależne odautocommit
ustawienia (domyślnie włączone):Alternatywnie, jeśli
autocommit=0
, moim zdaniem, jakiekolwiek oświadczenie po innym zakończeniu transakcji, rozpocznie transakcję (ale nadal możesz użyćSTART TRANSACTION
jawnie); tak przynajmniej interpretuję to :Mówiąc dokładniej, „inny sposób rozpoczęcia transakcji” wydaje się sugerować, że ustawienie „autocommit = 0” jest wystarczające do rozpoczęcia transakcji (przynajmniej tuż przed każdą instrukcją na początku sesji lub następującą po
COMMIT
/ROLLBACK
). Sugerowałbym użycieBEGIN
lubSTART TRANSACTION
jawne, nawet jeśliautocommit=0
, ponieważ może to ułatwić zrozumienie, kiedy transakcja się rozpoczyna lub kończy.(Sposób rozpoczęcia transakcji może zależeć od sposobu, w jaki aplikacja korzysta z MySQL.)
źródło
Domyślnie InnoDB jest ustawione na autocommit = 1 lub ON . Po popełnieniu nie można ich wycofać .
Będziesz musiał zrobić jedną z dwóch rzeczy, aby wyłączyć go w przyszłości:
OPCJA 1: Dodaj to do /etc/my.cnf i zrestartuj mysql
OPCJA 2: Wykonaj jedną z nich w otwartym Conenction DB przed rozpoczęciem jakiegokolwiek znaczącego SQL
W ramach tych dwóch opcji należy wykonać ręczne polecenie COMMIT lub ręczne polecenie ROLLBACK .
CAVEAT
Jeśli tabelą jest MyISAM, wyjaśnienie jest prostsze. Ponieważ nie ma transakcji dla mechanizmu pamięci MyISAM, wszystkie wykonane operacje INSERT, UPDATE i DELETE są trwałe. Żadnych wycofań.
źródło