| Termin | Definicja |
|---|---|
| Transakcje w skryptach T-SQL | Transakcje w skryptach T-SQL pozwalają zapewnić spójność wielu poleceń wykonywanych sekwencyjnie. Transakcje T-SQL jako mechanizm spójnego wykonywania operacjiTransakcje w skryptach T-SQL służą do grupowania kilku powiązanych poleceń w jedną logiczną operację. Dzięki temu baza danych może potraktować cały zestaw zmian jako całość, a nie jako zbiór niezależnych instrukcji. Ma to znaczenie wszędzie tam, gdzie wynik jednego polecenia wpływa na sens następnych. Przykładem może być przeniesienie środków pomiędzy dwoma kontami, zapis zamówienia wraz z jego pozycjami albo aktualizacja danych klienta oraz powiązanych informacji kontaktowych. Najważniejsza zasada polega na tym, że transakcja powinna zakończyć się albo pełnym zatwierdzeniem zmian, albo ich wycofaniem. W pierwszym wariancie używa się instrukcji W typowym skrypcie transakcja rozpoczyna się od Transakcje w skryptach T-SQL a atomowość, blokady i kolejność działańTransakcje opierają się na kilku właściwościach kojarzonych z modelem ACID. Atomowość oznacza traktowanie operacji jako całości. Spójność wymaga, aby po zakończeniu transakcji dane nadal spełniały reguły zdefiniowane w bazie i w aplikacji. Izolacja opisuje sposób, w jaki równoległe operacje widzą wzajemnie swoje zmiany. Trwałość oznacza zachowanie zatwierdzonych danych mimo zakończenia sesji lub wystąpienia typowej awarii systemu. Warto odróżnić transakcję od pojedynczego polecenia SQL. Pojedynczy Podczas działania transakcji silnik może zakładać blokady na zmienianych wierszach, zakresach albo tabelach. Blokady są potrzebne, aby równoległe sesje nie doprowadziły do sprzecznych wyników, ale zbyt długa transakcja może ograniczać dostęp innych użytkowników. Szczególne znaczenie ma kolejność odczytów i modyfikacji. Dwie transakcje, które blokują zasoby w odmiennej kolejności, mogą doprowadzić do zakleszczenia. W takim przypadku silnik wybiera jedną transakcję do przerwania, a skrypt powinien być przygotowany na ponowienie operacji. Poziom izolacji wpływa na kompromis pomiędzy spójnością odczytu a współbieżnością. Niższa izolacja może ograniczyć oczekiwanie na blokady, lecz zwiększa ryzyko odczytu danych tymczasowych lub zmieniających się w trakcie analizy. Wyższa izolacja lepiej chroni wynik odczytu, ale może powodować większą liczbę blokad i dłuższe oczekiwanie. Dobór ustawienia powinien wynikać z charakteru operacji, a nie z przyzwyczajenia. Obsługa błędów w transakcjach T-SQL i kontrola wynikuBezpieczny skrypt transakcyjny powinien rozróżniać sukces od częściowego wykonania. W T-SQL często wykorzystuje się konstrukcję Przykładowy schemat logiczny może wyglądać następująco:
Przed zatwierdzeniem przydatna może być funkcja Nie każdy komunikat ostrzegawczy ma taki sam skutek jak błąd uniemożliwiający wykonanie instrukcji. Dlatego testowanie powinno obejmować błędy składni, naruszenia ograniczeń, brak oczekiwanego rekordu, konflikt równoległych zmian oraz przerwanie połączenia. Trzeba też sprawdzić, czy procedura nie zatwierdza zmian po niepełnym wykonaniu wcześniejszego kroku. Projektowanie transakcji T-SQL w procedurach i skryptachTransakcja powinna obejmować możliwie mały, ale kompletny fragment pracy. Nie należy rozpoczynać jej zbyt wcześnie, na przykład przed długimi obliczeniami, pobieraniem danych niezwiązanych z modyfikacją albo oczekiwaniem na dane z zewnętrznego źródła. Długi czas trwania zwiększa ryzyko blokad, zakleszczeń i spadku wydajności. Najlepiej przygotować wartości potrzebne do operacji wcześniej, a następnie możliwie szybko wykonać zmianę i zamknąć transakcję. Przed rozpoczęciem modyfikacji warto zweryfikować warunki, które decydują o poprawności operacji. Jeżeli skrypt ma zmienić konkretny rekord, należy ustalić, co ma się stać, gdy rekord nie istnieje albo gdy liczba zmienionych wierszy różni się od oczekiwanej. Weryfikacja liczby wierszy po Procedury korzystające z transakcji powinny jasno określać, kto zarządza zakresem transakcji. Problem może pojawić się wtedy, gdy procedura zawsze wykonuje Do diagnozowania problemów przydają się dzienniki aplikacyjne, informacje o czasie trwania zapytań, obserwacja oczekiwań oraz analiza planów wykonania. Warto mierzyć nie tylko czas całej procedury, ale również poszczególne etapy. Dzięki temu można rozpoznać, czy przyczyną spowolnienia jest duża liczba zmienianych rekordów, brak właściwego indeksu, oczekiwanie na blokadę, zakleszczenie czy zbyt szeroki zakres transakcji. Kiedy sprawdzić transakcje w skryptach T-SQL w praktyceO przegląd transakcji warto zadbać, gdy w danych pojawiają się częściowo wykonane operacje, rozbieżności pomiędzy tabelami, nieoczekiwane blokady albo komunikaty o zakleszczeniach. Sygnałem ostrzegawczym są także procedury, które pozostawiają aktywną transakcję po zakończeniu działania, wykonują wiele niepowiązanych zadań w jednym zakresie lub wycofują zmiany bez zapisania przyczyny błędu. Analiza powinna objąć kod T-SQL, sposób wywoływania procedur, ustawienia połączeń oraz zachowanie aplikacji przy utracie połączenia. Przydatne jest przygotowanie scenariuszy testowych obejmujących jednoczesne uruchomienie kilku sesji. Należy sprawdzić, czy dane pozostają spójne, czy druga sesja prawidłowo czeka albo otrzymuje kontrolowany błąd oraz czy po niepowodzeniu nie pozostają blokady. Test powinien uwzględniać również większy zakres danych, ponieważ skrypt działający poprawnie na kilku rekordach może zachowywać się inaczej przy masowej aktualizacji. Jeżeli problem dotyczy komputera używanego do uruchamiania narzędzi bazodanowych, konfiguracji środowiska, połączenia lub działania skryptów, można skonsultować stan sprzętu i oprogramowania z firmą Warszawskie Pogotowie Komputerowe 24/7. Wcześniej warto zanotować treść komunikatu, moment wystąpienia problemu, nazwę używanego narzędzia oraz informację, czy błąd pojawia się przy każdej transakcji, czy tylko przy określonych danych. Najważniejsze pozostaje rozdzielenie dwóch kwestii: poprawności logiki transakcji oraz sprawności środowiska, w którym skrypt jest uruchamiany. Dobrze zaprojektowana transakcja ma jasno określony początek i koniec, kontroluje błędy, nie przetrzymuje blokad dłużej niż potrzeba i pozostawia system w przewidywalnym stanie zarówno po sukcesie, jak i po wycofaniu zmian. |