/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.