Reklama
Wizyt
Dzisiaj: 286Wszystkich: 520563

Transakcje

Technikum » SBD » SQL » Transakcje


W bazach danych transakcja to zbiór wykonywanych operacji, które stanowią całość. Muszą zostać wykonane wszystkie operacje wchodzące w skład transakcji lub nie zostanie wykonana żadna z nich. Przykładem transakcji jest wykonywanie przelewu z jednego konta na drugie. Operacja przelewu musi zostać wykonana w całości, a jeżeli nie jest to możliwe, należy powrócić do stanu sprzed rozpoczęcia wykonywania operacji przelewu.

Transakcja składa się z trzech etapów:

  • rozpoczęcia,
  • wykonania,
  • zakończenia.

 

Właściwości transakcji


Transakcja posiada następujące własności:

  • atomic — transakcja jest niepodzielna, czyli jest wykonywana w całości lub w całości jest odwoływana.
  • consistent — transakcja nie zmienia spójności (integralności) bazy danych, czyli wykonanie transakcji nie doprowadzi do utraty spójności danych. Jeżeli baza danych była spójna przed wykonaniem transakcji, to jest spójna również po jej zakończeniu.
  • isolated — transakcja musi być izolowana, czyli nie może istnieć konflikt z innymi transakcjami wykonywanymi w tym samym czasie na tym samym zbiorze danych.
  • durable — transakcja jest trwała, czyli działania wykonane w transakcji są trwałe niezależnie od tego, co się będzie działo po jej zakończeniu.

W trakcie wykonywania transakcji stosowany jest mechanizm blokowania, który gwarantuje spójność bazy danych. Oznacza to, że podczas wykonywania transakcji dane, na których jest ona wykonywana, nie ulegną zmianie lub usunięciu.
Pierwsze litery własności transakcji tworzą skrót ACID określający reguły, które muszą być spełnione przez serwery bazodanowe, aby transakcje mogły być wykonywane.


W serwerze SQL Server transakcja może być wykonywana na trzy sposoby:

  • Explicitjawnie. Rozpoczęcie transakcji jest realizowane za pomocą polecenia BEGIN TRANSACTION.
  • Autocommitautomatycznie. Operacje wykonywane na serwerze są standardowo traktowane jako transakcje, w związku z czym nie ma potrzeby ich rozpoczynania poleceniem BEGIN TRANSACTION. Po poprawnym wykonaniu każde z poleceń jest automatycznie zatwierdzane.
  • Implicitniejawnie. Transakcje są wywoływane przez programy użytkowe działające na bazie danych.

 

Transakcje Explicit


Transakcje Explicit są wykonywane, jeżeli zadeklarujemy chęć wykonania zapytania lub bloku zapytań w ramach transakcji za pomocą polecenia BEGIN TRANSACTION.
Zatwierdzenie zmian i zakończenie transakcji deklarujemy za pomocą instrukcji COMMIT. Polecenie to zdejmuje blokady z tabel założone na czas trwania transakcji. Natomiast użycie instrukcji ROLLBACK odwołuje transakcję i odrzuca wszystkie zmiany dokonane podczas trwania transakcji. Polecenie to również zdejmuje blokady z tabel założone na czas trwania transakcji.


Przykład
Załóżmy, że od nowego roku ceny książek w księgarni internetowej wydanych po roku 2010 wzrosły o 5%, a ceny książek wydanych przed rokiem 2008 zmalały o 2%. Wykonywanie operacji zmiany cen książek zostanie zabezpieczone transakcją.




Pierwsza instrukcja (BEGIN TRANSACTION) uruchomiła transakcję, następna (UPDATE) przeprowadziła operację na danych. Kolejny blok to instrukcje sprawdzające, czy transakcja się powiodła. Ponieważ zmienna systemowa @@ERROR standardowo zwraca informację z numerem ostatniego błędu, może zostać użyta do sprawdzenia, czy w trakcie operacji zmiany ceny książek wystąpił błąd. Jeśli błąd nie wystąpił, zmienna ma wartość zero. Jeśli błąd wystąpił, zostanie wyświetlony komunikat (instrukcja RAISERROR) i transakcja zostanie odwołana (ROLLBACK). Jeżeli operacja przebiegła pomyślnie, przechodzimy do kolejnej operacji zmiany ceny książek.

Pojedyncza instrukcja UPDATE (dotyczy to również instrukcji DELETE i INSERT) nie musiałaby być poprzedzona uruchomieniem transakcji, ponieważ dla niej transakcja zostanie uruchomiona automatycznie. W podanym wyżej przykładzie modyfikowane dane są ze sobą wzajemnie powiązane, czyli niepowodzenie przy modyfikacji jednego zbioru danych powinno spowodować anulowanie modyfikacji drugiego zbioru danych - dlatego należy użyć transakcji.

 

Transakcje Autocommit


Transakcje Autocommit podobnie jak transakcje Implicit inicjuje MS SQL Server za każdym razem, gdy zostanie wydane polecenie modyfikowania danych. Ale po wykonaniu polecenia serwer automatycznie zatwierdza lub odrzuca transakcję.
Dla serwera MS SQL Server tryb automatyczny jest domyślnym trybem zarządzania transakcjami. Należy pamiętać, że jeżeli pracujemy w trybie Autocommit, każde wydane polecenie jest osobną transakcją.


Przykład
Wykorzystując funkcję systemową @@TRANCOUNT, sprawdzimy działanie trybu automatycznego transakcji. Funkcja ta zwraca liczbę otwartych w danym momencie transakcji.

W wyniku wykonania kodu zobaczymy, że przed rozpoczęciem wykonywania instrukcji UPDATE i po jej zakończeniu nie było otwartych żadnych transakcji.

 

Transakcje Implicit


Transakcje Implicit inicjuje MS SQL Server, wydając niejawnie polecenie BEGIN TRANSACTIONS. Transakcje niejawne są przeprowadzane, gdy wykonywana jest jedna z następujących komend: ALTER TABLE, CREATE, DELETE, DROP, FETCH, GRANT, INSERT, OPEN, REVOKE, SELECT, TRUNCATE, UPDATE. Naszym zadaniem jest zakończenie transakcji i jej zatwierdzenie lub wycofanie. Aby serwer pracował w trybie transakcji niejawnych, należy je włączyć za pomocą polecenia:

          SET IMPLICIT_TRANSACTIONS ON

Po wykonaniu tego polecenia do końca sesji będą realizowane transakcje niejawne. W celu wcześniejszego zakończenia pracy w trybie transakcji niejawnych trzeba wpisać polecenie:

          SET IMPLICIT_TRANSACTIONS OFF

Ten tryb pracy może stwarzać problemy z bazą danych wtedy, gdy zapomnimy zatwierdzić lub wycofać transakcję. Pozostanie ona otwarta i będzie blokowała dostęp do danych. Jego zaletą jest możliwość wycofywania przypadkowych lub błędnych modyfikacji danych.


Przykład
Wykorzystując polecenie SET IMPLICIT_TRANSACTIONS ON, ustawimy tryb niejawny transakcji. Następnie stosując zmienną systemową @@TRANCOUNT, sprawdzimy działanie trybu niejawnego transakcji.


Przed rozpoczęciem wykonywania instrukcji UPDATE nie było otwartych żadnych transakcji. Natomiast po jej zakończeniu pozostała rozpoczęta jedna transakcja, ponieważ nie została ona automatycznie zamknięta. Użytkownik powinien zamknąć transakcję, zatwierdzając zmiany lub je wycofując. Aby zamknąć transakcję, należy wykonać polecenie:

          COMMIT;
          SET IMPLICIT_TRANSACTIONS OFF;


Dopóki transakcja nie zostanie zamknięta, dostęp do tabeli Ksiazki będzie niemożliwy.

 

Zagnieżdżanie transakcji


W ramach już rozpoczętej transakcji można umieścić kolejną instrukcję BEGIN TRANSACTION. Wynikiem takiego działania jest zwiększenie liczby otwartych transakcji, a nie rozpoczęcie nowej transakcji.
Mechanizm zagnieżdżonych transakcji wygląda następująco: wykonanie kolejnej instrukcji BEGIN TRANSACTION zwiększa o jeden liczbę otwartych transakcji, wykonanie instrukcji COMMIT zmniejsza o jeden liczbę otwartych transakcji, natomiast wykonanie instrukcji ROLLBACK zamyka transakcje i ustawia liczbę otwartych transakcji na zero.


Przykład


W podanym przykładzie po pierwszym odczycie zmiennej @@TRANCOUNT otrzymamy jedną otwartą transakcję, następnie dwie, później trzy, znowu dwie i na końcu zero otwartych transakcji.

 

Punkty przywracania


W większości serwerów bazodanowych można wycofać nie tylko całą transakcję, ale także jej część. W tym celu należy utworzyć punkty przywracania za pomocą instrukcji
SAVE TRANSACTION.


Przykład


W podanym przykładzie instrukcja BEGIN TRANSACTION uruchomi transakcję. Po dodaniu do tabeli Klient danych jednego klienta instrukcja SAVE TRANSACTION P1 utworzy punkt przywracania. Po dodaniu do tabeli Klient danych kolejnego klienta, transakcja zostanie odwołana, ale nie zostaną odrzucone wszystkie zmiany dokonane podczas trwania transakcji, tylko zmiany wprowadzone po zdefiniowanym punkcie przywracania. W rezultacie, mimo że transakcja została odwołana, w tabeli Klient zostaną zapisane dane klienta o nazwisku Gordon, natomiast dane klienta o nazwisku Zieliński zostaną anulowane.

 

UWAGA
Należy pamiętać o zamknięciu transakcji. Inaczej dostęp do tabel Klient będzie niemożliwy.

 

Reklama