Samo otwarcie transakcji nie będzie miało prawie żadnych konsekwencji. Prosty
BEGIN TRANSACTION
-- wait for a while, doing nothing
-- wait a bit longer
COMMIT
będzie w najgorszym przypadku zawierać kilka bajtów wartości statusu. Nie ma sprawy.
Większość programów wykona rzeczywistą pracę w ramach transakcji, a to inna sprawa. Istotą transakcji jest to, że możesz być pewien, że kilka faktów w bazie danych jest jednocześnie prawdziwych, mimo że inni użytkownicy piszą do tej samej bazy danych jednocześnie.
Weź kanoniczny przykład transferu pieniędzy między kontami bankowymi. System musi upewnić się, że konto źródłowe istnieje, ma wystarczające fundusze, konto docelowe istnieje oraz że zarówno debet, jak i kredyt wystąpią lub nie wystąpią. Musi to zagwarantować, dopóki będą miały miejsce inne transakcje, być może nawet między tymi dwoma kontami. System zapewnia to, blokując dane tabele. Jakie blokady są podejmowane i ile pracy innych ludzi widzisz, jest kontrolowane przez poziom izolacji transakcji .
Jeśli wykonasz dużo pracy, istnieje duża szansa, że w kolejce będą czekać inne transakcje na obiekty, na których trzymasz zamki. Spowoduje to zmniejszenie ogólnej przepustowości systemu. W końcu przekroczą limity czasu i przestaną działać, co stanowi problem dla ogólnego zachowania systemu. Jeśli użyjesz optymistycznego poziomu izolacji, transakcja może się nie powieść podczas próby zatwierdzenia z powodu pracy innej osoby.
Trzymanie zamków zabiera zasoby systemowe. Jest to pamięć, której system nie może wykorzystać do przetwarzania innych żądań, co zmniejsza przepustowość.
Jeśli wykonano dużo pracy, system może zdecydować się na eskalację blokady . Zamiast blokować poszczególne rzędy cały stół zostanie zablokowany. Wpłynie to na większą liczbę jednoczesnych użytkowników, przepustowość systemu spadnie jeszcze bardziej, a wpływ aplikacji będzie większy.
Zmiany danych są zapisywane w pliku dziennika, podobnie jak blokady, które je chronią. Nie można ich usunąć z dziennika, dopóki transakcja nie zostanie zatwierdzona. Dlatego bardzo długa transakcja może powodować wzdęcie pliku dziennika i związane z tym problemy.
Jeśli bieżąca praca korzysta z tempdb, co jest prawdopodobne w przypadku dużych obciążeń, zasoby mogą być powiązane do końca transakcji. W skrajnych przypadkach może to spowodować niepowodzenie innych zadań, ponieważ nie ma już dla nich wystarczającej ilości miejsca. Miałem przypadki, w których źle zakodowane UPDATE wypełnione tempdb, więc brakowało dysku na SORT raportu i raport nie powiódł się.
Jeśli wybierzesz ODWRÓCENIE transakcji lub system zawiedzie i odzyska, czas potrzebny na ponowne udostępnienie systemu będzie zależał od ilości wykonanej pracy. Samo otwarcie transakcji nie wpłynie na czas odzyskiwania, to ile pracy zostało wykonane. Jeśli transakcja była otwarta, ale bezczynna przez godzinę, powrót do zdrowia będzie prawie natychmiastowy. Jeśli pisał nieprzerwanie dla tej godziny, podstawową zasadą jest to, że czas powrotu do zdrowia wyniesie około godziny.
Jak widać, długa transakcja może być problematyczna. W przypadku systemów OLTP najlepszą praktyką jest posiadanie jednej transakcji bazy danych na transakcję biznesową. Do pracy wsadowej wprowadzaj proces w blokach, z częstymi zatwierdzeniami i ponownie uruchom kodowanie logiczne. Zazwyczaj w ramach jednej transakcji DB można przetworzyć kilka tysięcy rekordów, ale należy to przetestować pod kątem współbieżności i zużycia resoruce.
Nie kusz się, aby przejść do drugiej skrajności i całkowicie unikać transakcji i blokad. Jeśli chcesz zachować spójność swoich danych (i dlaczego miałbyś korzystać z bazy danych?) Poziomy izolacji i transakcje mają bardzo ważny cel. Dowiedz się o swoich opcjach i zdecyduj, z jaką równowagą współbieżności i poprawności jesteś przygotowany do życia dla każdej części aplikacji.