Jeśli transakcja jest „zatwierdzona”, to czy jest na pewno zapisywana?

12

Jeśli transakcja jest zaangażowana powodzeniem mogę wtedy być w 100% pewien, że został napisany na bazie danych oraz do plików dziennika? Czy mogę mieć pewność, że dane są ZAPISANE?

Dzisiaj nasze pliki dziennika osiągnęły limit dysku i otrzymaliśmy wiele błędów. Ponadto niektóre inne usługi uległy awarii. Zwiększyliśmy dysk i zrestartowaliśmy serwer.

Podczas uruchamiania serwer wykonał „odzyskiwanie bazy danych” - czy mogę mieć pewność, że wszystko znów jest w porządku?

SQL Police
źródło
2
Możesz sprawdzić dziennik błędów po zakończeniu odzyskiwania, aby zobaczyć, ile transakcji zostało zatwierdzonych i ile zostało wycofanych. Nie ma magicznej odpowiedzi na to pytanie - jeśli dysk ulegnie awarii, wszystko zależy od stanu transakcji w tym czasie.
Aaron Bertrand
1
@AaronBertrand Ale jeśli transakcja jest w stanie „zatwierdzona” (tzn. Zatwierdzenie zakończyło się powodzeniem), jak to możliwe, że nadal będzie się gubić podczas odzyskiwania?
SQL Police
3
@Giosco: Nie może. „zatwierdzony” oznacza, że ​​znajduje się on w pliku dziennika bazy danych. Jedynym sposobem, aby go potem utracić, jest albo 1) utrata pliku dziennika, zanim zostanie on zapisany w pliku danych, lub 2) utrata zarówno pliku dziennika, jak i pliku danych, lub 3) błąd ludzki. Zauważ, że (3) jest zwykle najbardziej prawdopodobna.
RBarryYoung
2
@Giosco, skąd wiesz, że wszystkie transakcje w czasie pełnego dysku zostały pomyślnie zatwierdzone?
Aaron Bertrand
2
Procedura przechowywana <> transakcja - twoja procedura przechowywana może zawierać wiele jawnych transakcji lub tylko niejawna, może istnieć logika try / catch, może istnieć obsługa transakcji na warstwie C # itp. Ponownie, zakładając, że żaden wyjątek = pomyślne zatwierdzenie może być trochę zbyt niebezpieczne jako ogólne stwierdzenie.
Aaron Bertrand

Odpowiedzi:

16

Jeśli aplikacja kliencka wydała COMMIT i otrzymała kod powodzenia, silnik gwarantuje, że transakcja będzie trwała. Gwarantujemy, że wszystkie zmiany dokonane w transakcji będą widoczne, nawet po awarii. Ponadto odzyskiwanie gwarantuje również, że każda niezatwierdzona transakcja zostanie wycofana w przypadku awarii.

Aby uzyskać więcej informacji, polecam przeczytać artykuł ARIES .

Rejestrowanie z wyprzedzeniem zapisu i odzyskiwanie nie może zagwarantować, że podstawowy sprzęt pamięci ma błędy (uszkodzenie). Każdy produkt inżynierski może zawierać wady.

Twoja aplikacja, podobnie jak wszystkie inne aplikacje, musi być starannie napisana, aby działała poprawnie w przypadku awarii (błędów). Nie ma magii.

Remus Rusanu
źródło
Jeśli aplikacja kliencka wydała komunikat COMMIT, ale nie otrzymano odpowiedzi z bazy danych, dopóki nie upłynie limit czasu po stronie klienta. Co z tym zatwierdzeniem? sukces czy porażka? Jak sprawdzić?
Gab 是 好人