Czy WSTAWKI są automatycznie zatwierdzane?

13

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?

RPK
źródło
Dla wyjaśnienia, otagowałem jako „innodb” 19 godzin temu, ponieważ InnoDB używa COMMIT / ROLLBACK.
RolandoMySQLDBA,
Otrzymuje to +1 za przypomnienie deweloperom i DBA o zwróceniu uwagi na zachowanie transakcyjne, odpowiadające paradygmaty aplikacji obsługujące transakcje i ich konsekwencje (dobre lub złe).
RolandoMySQLDBA
Odpowiedziałem na twoje pytanie komentarzem pod moją odpowiedzią.
RolandoMySQLDBA

Odpowiedzi:

10

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, 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ędzy BEGINi COMMIT.)

Jeśli jednak masz do czynienia z transakcjami w sposób jawny, będziesz musiał użyć, COMMITaby 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(lub BEGIN). Jest to niezależne od autocommitustawienia (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, moim zdaniem, jakiekolwiek oświadczenie po innym zakończeniu transakcji, rozpocznie transakcję (ale nadal możesz użyć START TRANSACTIONjawnie); tak przynajmniej 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Ę, ZAPISZ SIĘ 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 BEGINlub START TRANSACTIONjawne, nawet jeśli autocommit=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.)

Bruno
źródło
1
Zasługuje na +1 za pełne zdefiniowanie protokołów transakcyjnych.
RolandoMySQLDBA
@Bruno, w przypadku MyISAM, gdzie „zatwierdzenie” i „wycofanie” nie działają, czy wstawki nie byłyby w połowie zatwierdzone?
Pacerier
7

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

[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ę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ń.

RolandoMySQLDBA
źródło
Aby uzyskać dodatkowe wyjaśnienia, moja odpowiedź dotyczy zarówno silników pamięci masowej InnoDB, jak i MyISAM.
RolandoMySQLDBA,
1
Na wypadek gdyby funkcja automatycznego zatwierdzania była wyłączona w programie InnoDB, a moja aplikacja uruchamia wstawianie zapytań, a ja zapomniałem wykonać zatwierdzenie, jak szybko zostaną utracone zmiany?
RPK,
Jeśli aplikacja ręcznie uruchamia polecenie COMMIT po każdym WSTAWIENIU, jest ono zapisywane i nie można go usunąć. Jeśli połączenie DB umrze przed zatwierdzeniem, wszystkie zmiany zostaną utracone i nastąpi wycofanie. Jeśli wykonasz dowolny DDL (UTWÓRZ TABELĘ, DROP TABLE, ALTER TABLE itp.) Lub ręcznie wydasz blokadę tabeli, WSTAWKI zostaną automatycznie zatwierdzone. Jeśli użyjesz START TRANSAKCJI, wszystkie niezaangażowane zmiany zostaną zatwierdzone.
RolandoMySQLDBA
1
Odnośnie „Jeśli użyjesz START TRANSAKCJI, wszystkie nieprzewidziane zmiany zostaną zatwierdzone”. (w kontekście DDL, w przeciwnym razie byłby wycofany), istnieje również ukryte zatwierdzenie przed (ukryte zatwierdzenie później pochodzi z wersji 5.5.3 zgodnie z dokumentacją).
Bruno,
1
„Jeśli użyjesz START TRANSAKCJI, wszystkie niezaangażowane zmiany zostaną zatwierdzone.” - Ten pomysł zaczerpnąłem z Przewodnika po certyfikacji MySQL 5.0 (ISBN 0-672-32812-7) Strona 418, który nazywa START TRANSAKCJA, USTAW AUTOCOMMIT = 1, BLOKADA TABEL, UNLOCK TABEL, TRUNCATE TABELA, RENAME TABELA, INDEKS KROPKI , DROP DATABASE, CREATE INDEX, BEGIN i ALTER TABLE w nagłówkach „W niektórych okolicznościach bieżąca transakcja może zostać niejawnie zakończona: jeśli wydasz dowolne z poniższych instrukcji, InnoDB domyślnie zatwierdzi poprzednie nieprzypisane instrukcje bieżącej transakcji i rozpocznie nowa transakcja ”.
RolandoMySQLDBA,