encyklopedia.space

Transakcje (bazy danych)

Transakcja w systemach baz danych to logiczna jednostka pracy, która składa się z jednego lub więcej poleceń SQL i jest wykonywana w sposób atomowy. Oznacza to, że wszystkie operacje wchodzące w skład transakcji muszą zostać zakończone pomyślnie, aby ich efekty zostały utrwalone w bazie. W przeciwnym razie cała transakcja jest wycofywana (rollback) i system przywraca stan sprzed jej rozpoczęcia.

Podstawowe własności – model ACID

Model ACID definiuje cztery kluczowe właściwości transakcji:

  • Atomiczność (Atomicity) – transakcja jest niepodzielną całością; jej części nie mogą zostać zatwierdzone osobno.
  • Spójność (Consistency) – po zakończeniu transakcji baza danych przechodzi ze stanu spójnego do kolejnego stanu spójnego, spełniając wszystkie reguły integralności.
  • Izolacja (Isolation) – jednoczesne wykonywanie wielu transakcji nie wpływa na ich wzajemną poprawność. Stopień izolacji jest określany przez poziomy opisane w standardzie ISO/IEC 9075 (np. Read Uncommitted, Read Committed, Repeatable Read, Serializable).
  • Trwałość (Durability) – po zatwierdzeniu (commit) zmiany są trwale zapisane w trwałym nośniku i nie znikną nawet w wyniku awarii systemu.

Cykl życia transakcji

Typowy cykl życia transakcji składa się z następujących etapów:

  1. Rozpoczęcie – polecenie BEGIN TRANSACTION lub jego odpowiednik w danym systemie DBMS.
  2. Wykonywanie operacji – wykonywanie zapytań SQL, modyfikacji danych, odczytów i operacji kontrolujących integralność.
  3. Zatwierdzenie – polecenie COMMIT powoduje trwałe zapisanie zmian.
  4. Wycofanie – w razie błędu lub żądania użytkownika polecenie ROLLBACK przywraca bazę do stanu sprzed rozpoczęcia transakcji.

Mechanizmy izolacji i kontrola współbieżności

W celu zapewnienia izolacji stosuje się różne techniki, wśród których najważniejsze to:

  • Blokady (locking) – mechanizm pessimistic locking (blokowanie pesymistyczne) uniemożliwia innym transakcjom dostęp do chronionych danych aż do zakończenia bieżącej transakcji.
  • Optymistyczna kontrola współbieżności – polega na wykrywaniu konfliktów w momencie zatwierdzania transakcji (np. poprzez wersjonowanie rekordów).
  • Systemy MVCC (Multi‑Version Concurrency Control) – dzięki przechowywaniu wielu wersji rekordów umożliwiają jednoczesny odczyt i zapis przy zachowaniu wysokiego poziomu izolacji.

Logowanie i przywracanie

Większość współczesnych relacyjnych baz danych utrzymuje log transakcji (tzw. write‑ahead log). Zapisy do logu są wykonywane przed modyfikacją rzeczywistych danych, co umożliwia odtworzenie stanu bazy po awarii poprzez odtworzenie (redo) lub cofnięcie (undo) operacji.

Rodzaje transakcji

Transakcje można podzielić według różnych kryteriów:

  • Transakcje jednofazowe – zakończone jedynie przez COMMIT lub ROLLBACK.
  • Transakcje dwufazowe (Two‑Phase Commit, 2PC) – używane w środowiskach rozproszonych, gdzie zatwierdzenie wymaga koordynacji wielu baz danych.
  • Transakcje długotrwałe – obejmujące operacje trwające od minut do dni; wymagają specjalnych mechanizmów, np. kompensacji i punktów kontrolnych.

Zastosowania

Transakcje są nieodzowne w systemach, w których konieczna jest spójność danych, m.in.:

  • Systemy bankowe i finansowe – zapewniają, że przelewy, debety i kredyty są rozliczane poprawnie.
  • Aplikacje e‑commerce – gwarantują integralność zamówień i płatności.
  • Systemy zarządzania zasobami (ERP, CRM) – umożliwiają bezpieczne aktualizacje stanów magazynowych, rekordów klientów itp.

Zalety i wady

Zalety:

  • Gwarancja spójności danych nawet przy błędach sprzętowych i programowych.
  • Ułatwienie programowania – programista może myśleć w kategoriach „wszystko albo nic”.
  • Wsparcie dla współbieżności przy zachowaniu silnych gwarancji izolacji.

Wady:

  • Obciążenie wydajnościowe – rejestrowanie logów i zarządzanie blokadami wpływa na szybkość operacji.
  • Ryzyko zatorów (deadlocków) w systemach intensywnie korzystających z blokad.
  • Złożoność przy projektowaniu rozproszonych transakcji (2PC, 3PC).

Przykład w języku SQL

BEGIN TRANSACTION;
UPDATE konta SET saldo = saldo - 100 WHERE nr_konta = '123456';
UPDATE konta SET saldo = saldo + 100 WHERE nr_konta = '654321';
COMMIT;

Powyższy fragment demonstruje prostą transakcję przelewu pomiędzy dwoma rachunkami. Jeśli którakolwiek z operacji aktualizacji się nie powiedzie, polecenie ROLLBACK przywróci pierwotny stan kont.

Powiązane pojęcia

Zobacz także