/Transakcje

Z Brain-wiki

TI:WTBD/Transakcje

Od relacyjnego systemu baz danych wymaga się zazwyczaj własności określanych hasłem ACID:

  • Atomic -- zlecona operacja modyfikacji danych udaje się w całości, albo wcale; nie może być operacji wykonanych częściowo
  • Consistent -- każda zakończona sukcesem operacja modyfikacji danych musi prowadzić do spójnego stanu bazy, tzn. zgodnego z więzami narzuconymi przez definicję danych
  • Isolated -- operacje modyfikacji danych nie mogą ze sobą interferować ani się przeplatać; nie powinny być również widoczne w stanie częściowego wykonania
  • Durable -- stan bazy będący wynikiem zakończonej operacji jest trwały; nie jest podatny na uszkodzenie w wyniku późniejszych nieudanych operacji czy błędów powstałych po zakończeniu tej operacji.

Najczęściej kompromisom podlega własność izolacji, ponieważ jej ścisłe przestrzeganie ma silny ujemny wpływ na wydajność w sytuacji wielodostępu.

SQLite, mimo że jest systemem wbudowanym (biblioteką operacji na danych w lokalnym pliku, a nie -- systemem klient-serwer) w dużym stopniu zachowuje własności ACID w sytuacji wielodostępu.

Po to, by również operacje na danych nie dające się sformułować jako pojedyncze instrukcje SQL mogły być traktowane jako operacje atomowe w powyższym sensie, SQL wprowadza pojęcie transakcji.

  • Każda operacja zmieniająca dane ma miejsce w ramach transakcji.
  • Jeżeli w chwili wydania polecenia zmieniającego dane nie ma otwartej transakcji, zostaje ona otwarta automatycznie.
  • Jawne otwarcie transakcji:
BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [ TRANSACTION ];
  • Czyli wystarczy napisać BEGIN. Domyślnie stosowana jest opcja DEFERRED.
  • Opcje różnią się sposobem stosowania blokad wielodostępu:
    • DEFERRED nic nie blokuje dopóki nie zacznie się wykonywać faktycznych operacji
    • IMMEDIATE blokuje od razu zapisy
    • EXCLUSIVE blokuje zapisy i odczyty (nieco upraszczając)
  • Zamknięcie transakcji to albo jej zatwierdzenie:
    • { COMMIT | END } [ TRANSACTION ];
  • albo jej wycofanie:
    • ROLLBACK [ TRANSACTION ];
  • Zamknięcie połączenia z bazą powoduje wycofanie bieżącej transakcji, o ile jakaś transakcja pozostawała otwarta.
  • Wycofanie może również nastąpić automatycznie, gdy w wykonaniu transakcji wystąpił błąd
  • Transakcji otwieranych poleceniem BEGIN nie można zagnieżdżać. Do tego służą punkty wycofania:
    • SAVEPOINT nazwa;
  • Do takie punktu można się w razie czego cofnąć:
    • ROLLBACK [ TRANSACTION ] TO [ SAVEPOINT ] nazwa;
  • Można też go ,,zwolnić":
    • RELEASE [ SAVEPOINT ] nazwa;
  • Nazwy punktów wycofania nie muszą być unikalne (SQLite), cofanie jest do najbliższego punktu o pasującej nazwie.