it-swarm.dev

Czy WSTAWKI są automatycznie zatwierdzane?

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
RPK

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

Domyślnie MySQL działa z włączonym trybem automatycznego zatwierdzania. Oznacza to, że jak tylko wykonasz instrukcję, która aktualizuje (modyfikuje) tabelę, MySQL przechowuje aktualizację na dysku, aby stała się trwała.

Tak więc, domyślnie, jeśli 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 między BEGIN a COMMIT.)

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 też mógł użyć ROLLBACK.

Możesz jawnie rozpocząć transakcję, używając START TRANSACTION (lub BEGIN). Jest to niezależne od ustawienia autocommit (domyślnie włączone):

Dzięki START TRANSACTION automatyczne zatwierdzanie pozostaje wyłączone, dopóki nie zakończysz transakcji za pomocą COMMIT lub ROLLBACK. Tryb automatycznego zatwierdzania powraca następnie do poprzedniego stanu.

Alternatywnie, jeśli autocommit=0, Myślę, że każde oświadczenie po innym zakończeniu transakcji rozpocznie transakcję (ale nadal możesz używać START TRANSACTION jawnie); tak przynajmniej ja interpretuję to :

Tryb automatycznego zatwierdzania. Jeśli ustawione na 1, wszystkie zmiany w tabeli zaczną obowiązywać natychmiast. Jeśli ustawione na 0, musisz użyć COMMIT, aby zaakceptować transakcję lub ROLLBACK, aby ją anulować. Jeśli autocommit ma wartość 0 i zmienisz go na 1, MySQL wykonuje automatyczne COMMIT każdej otwartej transakcji. Innym sposobem rozpoczęcia transakcji jest użycie instrukcji START TRANSACTION lub BEGIN. Zobacz Sekcja 12.3.1, „ROZPOCZNIJ TRANSAKCJĘ, ZGADŹ I SKŁADUJ ROLLBACK”.

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życie BEGIN lub START TRANSACTION i tak wyraźnie, nawet jeśli autocommit=0, ponieważ dzięki temu łatwiej jest zobaczyć, kiedy transakcja się rozpoczyna lub kończy.

(Sposób rozpoczęcia transakcji może zależeć od sposobu, w jaki aplikacja korzysta z MySQL.)

10
Bruno

Domyślnie InnoDB jest ustawione na autocommit = 1 lub ON . Po zatwierdzeniu 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

[mysqld]
autocommit=0

OPCJA 2: Wykonaj jedną z nich w otwartym Conenction DB przed rozpoczęciem jakiegokolwiek znaczącego SQL

SET autocommit = 0;
START TRANSACTION;

W ramach tych dwóch opcji należy wykonać ręczny COMMIT lub ręczny ROLLBACK .

CAVEAT

Jeśli tabelą jest MyISAM, wyjaśnienie jest prostsze. Ponieważ nie ma transakcji na aparat pamięci MyISAM, wszystkie wykonane operacje INSERT, UPDATE i DELETE są trwałe. Żadnych wycofań.

7
RolandoMySQLDBA