Transakcje w języku T-SQL w Microsoft SQL Server są fundamentalnym elementem zarządzania bazami danych i pozwalają na kontrolowanie spójności i integralności danych w bazie. Transakcje są używane do grupowania jednego lub więcej poleceń SQL w logiczną jednostkę pracy, którą można traktować jako jedną, niepodzielną operację. Oto kilka kluczowych pojęć dotyczących transakcji:
ACID
Transakcje w SQL Server muszą spełniać kryteria ACID, co oznacza:
- Atomicity (Atomowość): Transakcja jest albo wykonywana w całości, albo wcale. Jeśli którekolwiek z poleceń w transakcji zawiedzie, to cała transakcja zostanie wycofana.
- Consistency (Spójność): Transakcja musi zachować spójność danych. Przed i po transakcji dane muszą spełniać wszystkie zdefiniowane zasady integralności.
- Isolation (Izolacja): Transakcje muszą być izolowane od siebie nawzajem, co oznacza, że zmiany wprowadzone w jednej transakcji nie są widoczne dla innych, dopóki nie zostaną zatwierdzone.
- Durability (Trwałość): Po zatwierdzeniu, zmiany wprowadzone przez transakcję muszą być trwałe, nawet w przypadku awarii systemu.
Polecenia transakcyjne
Aby rozpocząć transakcję, używamy polecenia BEGIN TRANSACTION. Następnie wydajemy polecenia SQL, które chcemy uwzględnić w transakcji. Po wykonaniu operacji, używamy COMMIT do zatwierdzenia transakcji lub ROLLBACK, aby ją wycofać.
BEGIN TRANSACTION;
-- Twoje polecenia SQL
COMMIT; -- lub ROLLBACK;
Savepoints
Możemy również używać savepoints, które pozwalają na podział transakcji na mniejsze części. W przypadku problemu możemy wycofać transakcję do określonego savepointu zamiast całkowicie anulować całą transakcję.
Poziomy izolacji transakcji
W Microsoft SQL Server, poziomy izolacji transakcji definiują, jakie zmiany dokonane przez jedną transakcję są widoczne dla innych transakcji w systemie. SQL Server obsługuje różne poziomy izolacji, aby zapewnić odpowiedni balans między spójnością danych a wydajnością.
- READ UNCOMMITTED
- To najniższy poziom izolacji.
- Transakcja ma dostęp do danych, które zostały zaktualizowane przez inne transakcje, ale niezatwierdzone (dirty reads).
- Nie zapewnia spójności danych i może prowadzić do odczytu brudnych danych.
- Używa się go, gdy wymagana jest bardzo niska izolacja i wydajność jest kluczowa, a spójność danych nie jest ważna.
- READ COMMITTED
- Jest to domyślny poziom izolacji w SQL Server.
- Transakcja nie ma dostępu do danych, które nie zostały jeszcze zatwierdzone przez inne transakcje (uncommitted data).
- Zapewnia spójność danych i eliminuje odczyty brudnych danych.
- Jednak może doprowadzić do problemu znanego jako zjawisko "phantom reads", gdy inna transakcja wstawia nowy wiersz, który pasuje do warunków zapytania aktualnej transakcji.
- REPEATABLE READ
- Transakcja zachowuje spójność danych w czasie jej trwania.
- Zabezpiecza przed zjawiskiem "phantom reads" i odczytami brudnymi.
- Jednak nadal może doprowadzić do zjawiska znanego jako "lost update", gdzie dwie transakcje próbują zaktualizować ten sam wiersz jednocześnie.
- SERIALIZABLE
- To najwyższy poziom izolacji.
- Zapewnia najwyższą spójność danych i eliminuje zjawiska "phantom reads", "dirty reads" oraz "lost updates".
- Jednak jest to najwolniejszy poziom izolacji i może prowadzić do blokowania (lock contention) i wydajnościowych problemów w systemach o dużym obciążeniu.
Możesz określić poziom izolacji transakcji w SQL Server przy użyciu polecenia SET TRANSACTION ISOLATION LEVEL. Na przykład:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;