background image

 

 

 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

background image

 

 

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

background image

 

 

 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

background image

 

 

 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

background image

 

 

 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. 

background image

 

 

 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 

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. 

background image

 

 

 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();

background image

 

 

 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();

background image

 

 

 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,

background image

 

 

 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.


Document Outline