Czy to znaczy, że DB pozostaje uszkodzony
Należy zauważyć, że w żadnym momencie swojej Fragment kodu zawiera DB stać uszkodzony. Jednocześnie rejestruje zarówno oryginalny stan danych, jak i zmiany, które wprowadzasz w swojej transakcji.
Wyjątki podniesione przez rollback()
dotyczą klienta, a nie serwera. Awaria sieci podczas próby wycofania wyzwala wyjątek, aby klient mógł spróbować go obsłużyć, a ponieważ nie ma sensu w normalnym postępowaniu. Z perspektywy serwera wycofanie jest wyraźną instrukcją do odrzucenia zawartości transakcji. Jeśli polecenie rollback nigdy nie dotrze do bazy danych, baza danych po prostu wstrzyma się po zatwierdzeniu zmian, dopóki nie zdecyduje, że nie jest już potrzebna, w którym to momencie zmiany zostaną wyczyszczone w celu wyczyszczenia pamięci lub miejsca na dysku na serwerze.
Jeśli nie widziałem go wcześniej, prawdopodobnie szukasz terminu: ACID; opisuje to, w jaki sposób należy projektować bazy danych i inne współbieżne systemy, aby złagodzić tego rodzaju awarie. Baza danych zgodna z ACID ma pozostać spójna, nawet jeśli wystąpi fizyczna awaria w trakcie zatwierdzania lub wycofywania zmian - ostatni krok do zatwierdzenia zmiany (wewnątrz DB) powinien być atomowy, tak aby albo się udało, albo został odrzucony.
Jako stycznym przykład Mercurial ma podobną troskę o zapewnienie zobowiązuje nigdy opuścić the repo w niespójnym stanie. Kiedy użytkownik wprowadza zmianę, aktualizacje muszą być zapisane w wielu plikach, a każdy z tych zapisów może się nie udać. Tak więc robi to w ostrożnej kolejności, aby uniknąć niespójności.
- Najpierw poszczególne relikty plików są dołączane do powiązanych z nimi plików revlog w repozytorium, powiązanym z identyfikatorem zestawu zmian.
- Następnie manifest zawierający listę tych zmian jest aktualizowany, ponownie powiązany z identyfikatorem zestawu zmian.
- Dopiero po pomyślnym wykonaniu wszystkich powyższych operacji sam identyfikator zestawu zmian został zarejestrowany w dzienniku zmian (który jest pojedynczym zapisywaniem w postaci atomowej). Jeśli to zapis się powiedzie, zatwierdzenie się powiodło.
Jeśli Mercurial natrafi na nieznany identyfikator zestawu zmian w plikach rewizji lub pliku manifestu, zostanie zignorowany; w ten sposób zapewniając, że zmiana jest w pełni zaangażowana lub wcale.
Minęło trochę czasu, odkąd zajrzałem do wnętrza Mercurial, jest całkiem możliwe, że mam trochę tego pomieszanego, ale sedno jest poprawne.
Jeśli sieć przestaje działać, oznacza to, że żądanie wycofania nie dotarło do serwera MySQL, nieprawdaż? Potem, niezależnie od zmian, pozostaną tam. Mam nadzieję, że przeczytałeś dokumentację "Ta metoda powinna być używana tylko wtedy, gdy tryb automatycznego zatwierdzania został wyłączony." – kosa
Całkowicie zapomniałem wspomnieć, że jest to transakcja (autocommit = false) Przepraszam za to .. – SHH
Jeśli jest to transakcja, wszystkie akcje w ramach transakcji zostaną zatwierdzone dopiero po ... Cóż ...' .commit() 'Miejmy nadzieję, że [odkąd używasz MySQL] (http://grimoire.ca/mysql/choose-something-else) ... Jeśli możesz, przełącz się na PostgreSQL – fge