slajd 1
© J.Rumiński
Jacek Rumiński
Bazy danych
Kontakt:
Katedra Inżynierii Biomedycznej, pk.
106,
tel.: 3472678, fax: 3461757,
e-mail: jwr@eti.pg.gda.pl
slajd 2
© J.Rumiński
Transakcje
-Co to jest
-ACID
-Izolowanie
-Transakcja składa się z jednego lub więcej poleceń, które
zostały wywołane, wykonane i potwierdzone (Commit) lub
odrzucone (RollBack). Transakcja stanowi więc
jednostkową operację.
slajd 3
© J.Rumiński
Transakcje lokalne:
– Dotyczą jednego serwera bazy danych
– Obsługiwane przez dany serwer bazy danych
Transakcje globalne (rozproszone):
– Dotyczą więcej niż jednego serwera bazy danych
– Serwery mogą pochodzić od różnych dostawców
(heterogeniczne transakcje globalne)
– Obsługiwane przez zarządcę transakcji (ang. Transaction
manager):
• Zewnętrzny (np. dostępny w ramach serwera aplikacji)
• Wbudowany w jeden z serwerów biorących udział w
transakcji
slajd 4
© J.Rumiński
Własności transakcji (ACID)
• Atomowość (ang. atomicity)
– zbiór operacji składowych transakcji musi być wykonany w
całości lub wcale
• Spójność (ang. consistency)
– transakcja przeprowadza bazę danych z jednego stanu
spójnego do innego stanu spójnego
• Izolacja (ang. isolation)
– polega na logicznym odseparowaniu od siebie transakcji
współbieżnie wykonywanych w systemie (możliwe różne
poziomy izolacji)
• Trwałość (ang. durability)
– Odporność wyników zatwierdzonej transakcji na awarię
systemu
slajd 5
© J.Rumiński
Dla zapewnienia własności atomowości transakcji
rozproszonych opracowano protokół zatwierdzania
dwufazowego (2-Phase Commit)
• 1 – Prepare: węzły (serwery) biorące udział w transakcji
przygotowują się do jej zatwierdzenia (na żądanie
koordynatora transakcji)
• 2 – Commit: gdy wszystkie węzły są gotowe do
zatwierdzenia transakcji następuje jej rzeczywiste
zatwierdzenie
AUTOCOMMIT(FALSE):
HSQL:
SET AUTOCOMMIT { TRUE | FALSE } ; Switches on or off the
connection's auto-commit mode. If switched on, then all
statements will be committed as individual transactions.
Otherwise, the statements are grouped into transactions
that are terminated by either COMMIT or ROLLBACK. By
default, new connections are in auto-commit mode.
slajd 6
© J.Rumiński
Zarządzanie transakcją jest szczególnie ważne gdy chcemy
wykonać naraz kilka operacji. Wówczas konieczne jest
ustawienie
pracy
w
stanie
bez
potwierdzania
(Connection.setAutoCommit(false)- domyślnie ustawiona
jest praca z automatycznym potwierdzaniem), a następnie
po wykonaniu wyrażeń SQL wydawany jest rozkaz
potwierdzenia (Connection.commit()). Potwierdzenie jest
poleceniem, które powoduje, że zmiany spowodowane
wyrażeniem SQL stają się stałe. W przypadku błędu (np.
spowodowanego awarią sieci komputerowej) można wysłać
polecenie przerwania (RollBack) powodujące odtworzenie
stanu przed wykonaniem wyrażenia. Podsumowując można
powiedzieć, że efekt działania każdego polecenia SQL jest
tymczasowy
do
momentu
wysłania
polecenia
potwierdzenia, kiedy to zmiany stają się stałe lub do
momentu wysłania polecenia przerwania, kiedy to
odtwarzany jest stan przed wykonaniem polecenia.
slajd 7
© J.Rumiński
JDBC dodatkowo wprowadza szereg mechanizmów pracy z
transakcjami jak:
- obsługa paczek poleceń SQL:
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO kurs VALUES ('Jarek', 'JS',
30)");
stmt.addBatch("INSERT INTO kurs VALUES ('Andrzej', 'AM',
27)");
stmt.addBatch(""INSERT INTO kurs VALUES ('Ania', 'AM',
20)");
// wykonaj paczkę
int[] updateCounts = stmt.executeBatch();
slajd 8
© J.Rumiński
- obsługa znaczników – savepoint:
Statement stmt = conn.createStatement();
int rows = stmt.executeUpdate("INSERT INTO kurs VALUES ('Ania', 'AM',
20)");
// ustaw savepoint
Savepoint svpt1 = conn.setSavepoint("SAVEPOINT_1");
rows = stmt.executeUpdate("INSERT INTO kurs VALUES ('Jarek', 'JS', 30)");
(...)
//wycofaj efekt działania wszystkich wyrażeń SQL po znaczniku svpt1
conn.rollback(svpt1);
(...)
conn.commit();
slajd 9
© J.Rumiński
- obsługa transakcji współbieżnych, poprzez określenie modelu
izolacji transakcji:
conn.SetTransactionIsolation(level), gdzie level to:
1. Connection.TRANSACTION_NONE — sterownik nie obsługuje
transakcji – nie jest zgodny z JDBC,
2. Connection.TRANSACTION_READ_UNCOMMITTED —
transakcje mają dostęp do niezatwierdzonych danych (nowe
lub zmienione dane, lecz nie zatwierdzone przez commit()).
Możliwe są zatem zjawiska niepożądane znane jako
niespójność odczytów, niepowtarzalność odczytów i odczyty
fantomowe,
slajd 10
© J.Rumiński
3. Connection.TRANSACTION_READ_COMMITTED —
zmiany wprowadzone przez daną transakcję widoczne
dopiero po wywołaniu commit(). Możliwe są wciąż
zjawiska niepożądane jak niepowtarzalność odczytów i
odczyty fantomowe,
4. Connection.TRANSACTION_REPEATABLE_READ —
Możliwe są tylko odczyty fantomowe (np. jedna
transakcja dodaje wiersze druga aktualizuje – brak
aktualizacji dodawanych wierszy),
5. Connection.TRANSACTION_SERIALIZABLE —
niemożliwe są żadne powyższe zjawiska niepożądane.