slajd 1© J.Rumiński Jacek Rumiński Bazy danych Kontakt: Katedra Inżynierii Biomedycznej, pk. 106, tel.: , fax: ,
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. COMMITROLLBACK
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.