Jestem naprawdę zdezorientowany, jak zrozumieć fakt, że transakcja jest niepodzielna. Jeśli transakcja składa się z „zapytań”, to jak będzie niepodzielna. Odnoszę słowo „zapytania” do ogólnego zapytania SQL. Dlatego transakcja staje się wtedy niczym innym jak zbiorem zapytań SQL wykonywanych w tym samym czasie. Ale fakt, że każde zapytanie składa się z wielu operacji, tak naprawdę nie rozumiem, jak poprzednio wykonane zapytania (w tym samym zestawie) wycofują się, jeśli wystąpi błąd w późniejszym zapytaniu. Czego tu brakuje? Dziękuję!
Odpowiedź
TL; DR; Dziennik transakcji zawiera wszystkie informacje niezbędne do odtworzenia lub cofnięcia każdej transakcji, w zależności od tego, czy zawiera zapis zatwierdzenia dla tej transakcji, czy nie.
W bazach danych SQL atomowość transakcji realizowana jest najczęściej przy użyciu rejestrowanie z wyprzedzeniem (co oznacza, że wpisy dziennika transakcji są zapisywane przed zaktualizowaniem rzeczywistych tabel i indeksów).
Zapytania w ścisłym znaczeniu tego słowa, czyli SELECT
instrukcje i inne operacje odczytu, które nie zmieniają stanu bazy danych, nie są rejestrowane, ponieważ nie ma nic do zatwierdzenia lub wycofania, i jako taka koncepcja atomowości tak naprawdę nie ma tutaj zastosowania, przynajmniej na poziomie DBMS. Aplikacja korzystająca z wyników zapytania może wymagać wymuszenia niepodzielności przez odrzucenie wyników poprzednich zapytań, jeśli jedno z kolejnych zapytań zakończy się niepowodzeniem i spowoduje wycofanie.
Gdy instrukcje DML (INSERT
, UPDATE
, DELETE
, MERGE
) i inne instrukcje zmieniające stan bazy danych otrzymują wprowadzone zmiany są najpierw zapisywane w dzienniku zapisu z wyprzedzeniem (WAL). Jeśli wszystkie instrukcje powiedzie się i zostanie wydane zatwierdzenie (jawne lub niejawne), ten fakt jest również rejestrowany w WAL, a dziennik jest utrwalany. To sprawia, że zmiany są trwałe. Mogą zostać zapisane do rzeczywistych segmentów tabeli i indeksu w późniejszym czasie, podczas punktu kontrolnego lub powtórki dziennika.
Jednak jeśli jedna z instrukcji zawiedzie, w dzienniku nie będzie rekordu zatwierdzenia ta transakcja, a DBMS cofnie zmiany w tabeli i zindeksuje dokonane do tej pory przy użyciu poprzednich rekordów dziennika tej transakcji.
Podobnie, jeśli proces DBMS ulegnie awarii lub zgaśnie, nie będzie rekord zatwierdzenia dla transakcji w locie, a zmiany tabeli lub indeksu, które mogły już zostać utrwalone, zostaną cofnięte podczas odtwarzania dziennika.
Komentarze
- To nie jest ' t poprawne: " Zapytania w ścisłym znaczeniu tego słowa, czyli instrukcje SELECT i inne operacje odczytu które nie zmieniają stanu bazy danych, nie są rejestrowane, ponieważ nie ma nic do zatwierdzenia lub wycofania " – w zależności od ustawień bazy danych, nawet SELECT może rozpocząć niejawne tr działanie. brentozar.com/archive/2018/02/…
- I ' Nie mówię, że ' nie są pod kontrolą transakcji, ' mówię to, ponieważ są niczego nie zmieniają, nie są rejestrowane.
Odpowiedź
Transakcja jest atomowa, gdy jest hermetyzowana, jak to:
BEGIN TRAN UPDATE dbo.Users SET Reputation = Reputation + 1 WHERE Id = 26837; UPDATE dbo.Posts SET Score = Score + 1 WHERE Id = 227563; COMMIT
W takim przypadku obie aktualizacje w dwóch oddzielnych tabelach zostaną zatwierdzone razem lub wycofają się (zakończy się niepowodzeniem) razem. Atomowość oznacza jest to najmniejsza jednostka transakcji, która zostanie zatwierdzona.
Jeśli jednak później spróbujesz uruchomić oddzielne zapytanie poza tym zakresem, będzie to osobna transakcja.
Jeśli spróbujesz czegoś takiego:
BEGIN TRAN UPDATE dbo.Users SET Reputation = Reputation + 1 WHERE Id = 26837;
A potem w swojej aplikacji wykonujesz inne prace, takie jak kod C #, a następnie wracasz do bazy danych później i zrób to:
UPDATE dbo.Posts SET Score = Score + 1 WHERE Id = 227563; COMMIT
Wówczas zarówno wcześniejsza aktualizacja użytkowników, jak i następna aktualizacja postów zakończą się sukcesem lub niepowodzeniem, razem.
Jednak w prawdziwym życiu nie można trzymać transakcji otwartej, jak to przez dłuższy okres czasu, ponieważ będziesz blokować innym osobom wykonywanie pracy w bazie danych. Dlatego często będziesz otrzymywać porady typu: „Niech twoja transakcja będzie krótka i przyjemna”, co oznacza: wejdź do środka, zakończ pracę i wyjdź. Nie otwieraj jawnie transakcji.
Komentarze
- Transakcja jest zawsze niepodzielna, nie ' t it?
- Tak, ale w zależności od ustawień bazy danych możesz mieć włączone niejawne transakcje – co oznacza, że ' ponownie uzyskanie BEGIN TRAN, nawet jeśli nie ' nie prosisz o to. To zależy od dostawcy – na przykład słyszę, że Oracle domyślnie obsługuje transakcje niejawne, podczas gdy SQL Server nie.Możesz MYŚLić, że ' otrzymujesz tylko jedną transakcję, jeśli pochodzisz z Oracle w tle, podczas gdy możesz otrzymywać kilka różnych transakcji w SQL Server – z których każda byłaby niepodzielna.