Transakcje zarzdzane kontenerem n n n Kompatybilno z
Transakcje zarządzane kontenerem n n n Kompatybilność z wszystkimi typami EJB jak: encji, sesyjne, sterowane komunikatami. Brak oznaczeń początku i końca transakcji w kodzie EJB Prostota użycia. Kontener rozpoczyna transakcje tuz zaraz po uruchomieniu metody i zatwierdza ja tuz przed jej zakończeniem. Pojedyncza metoda może być związana z co najwyżej jedna transakcja. (wiele bądź zagnieżdżone transakcje nie są dozwolone) Nie każda metoda musi być związana z transakcja. Podczas składowania beana określa się które metody będą wiązane z transakcjami
Atrybuty transakcji kontrolują zasięg transakcji
Atrybuty transakcji mogą mieć wartość: n n n Required Requires. New Mandatory Not. Supported Supports Never Atrybuty transakcji można zmieniać podczas wielu faz rozwijania aplikacji (umieszczone w deployment descriptor)
n Pierwszeństwo maja reguły ustalone dla konkretnej metody beana przed regułami dotyczącymi ogólnie całego beana. n Reguły dla odpowiednich metod zależą od typu beana n Dla beanow sesyjnych można stosować transakcje do businessrole metod ale nie można do metod typu create n beany encji wymagają reguł dla metod typu: create, remove, business, i finder n Beany MDB wymagają reguł dla metody on. Message
Wycofywanie transakcji zarzadzanych kontenerem Wycofanie transakcji może być spowodowane przez: n n Rzucenie wyjątku systemowego Wywołanie metody set. Rollback. Only() (rzucenie wyjątku metody nie spowoduje wycofania transakcji) Zmienne instancyjne w beanach encji przywracane są automatycznie poprzez wywołanie metody ejb. Load Zmienne sesyjne w beanach sesyjnych nie są przywracane po wycofaniu transakcji i trzeba to zrobić np poprzez interfejs synchronizacji sesji.
public void transfer. To. Saving(double amount) throws Insufficient. Balance. Exception { checking. Balance -= amount; saving. Balance += amount; try { update. Checking(checking. Balance); if (checking. Balance < 0. 00) { context. set. Rollback. Only(); throw new Insufficient. Balance. Exception(); } update. Saving(saving. Balance); } catch (SQLException ex) { throw new EJBException ("Transaction failed due to SQLException: " + ex. get. Message()); } }
Synchronizacja zmiennych instancyjnych bean-ów sesyjnych n Metoda after. Begin() public void after. Begin() { System. out. println("after. Begin()"); try { checking. Balance = select. Checking(); saving. Balance = select. Saving(); } catch (SQLException ex) { throw new EJBException("after. Begin Exception: " + ex. get. Message()); } }
n Metoda before. Completion() (ostatnia szansa na wycofanie transakcji) n Metoda after. Completion() public void after. Completion(boolean committed) { System. out. println("after. Completion: " + committed); if (committed == false) { try { checking. Balance = select. Checking(); saving. Balance = select. Saving(); } catch (SQLException ex) { throw new EJBException("after. Completion SQLException: " + ex. get. Message()); } } }
Metody niedozwolone w transakcjach sterowanych kontenerem n Metody commit, set. Auto. Commit, i rollback z java. sql. Connection n Metoda get. User. Transaction z javax. ejb. EJBContext n Jakakolwiek metoda z javax. transaction. User. Transaction
Transakcje zarzadzane beanami n Ten rodzaj transakcji mogą mieć beany encji i sesyjne n Jawnie wewnątrz beana podaje się początek i koniec transakcji n Nie są już ograniczone na zagnieżdżone transakcje jak w przypadku transakcji zarządzanych kontenerem n Transakcje zarządzane przez beany musza być obsługiwane albo przez JDBC albo JTA
Transakcje JDBC n n Kontrolerem jest menadżer transakcji DBMS Metody commit i rollback z java. sql. Connection Transakcje JTA (Java Transaction API) n n Są zarządzane przez menadżera transakcji J 2 EE Pozwala on np na obsługę wielu baz danych od różnych dostawców. (praca z heterogeniczna baza) Minus J 2 EE nie wspomaga zagnieżdżonych transakcji Metody begin, commit, i rollback z javax. transaction. User. Transaction
public void ship (String product. Id, String order. Id, int quantity) { try { make. Connection(); con. set. Auto. Commit(false); update. Order. Item(product. Id, order. Id); update. Inventory(product. Id, quantity); con. commit(); } catch (Exception ex) { try { con. rollback(); throw new EJBException("Transaction failed: " + ex. get. Message()); } catch (SQLException sqx) { throw new EJBException("Rollback failed: " + sqx. get. Message()); } } finally { release. Connection(); } }
public void withdraw. Cash(double amount) { User. Transaction ut = context. get. User. Transaction(); try { ut. begin(); update. Checking(amount); machine. Balance -= amount; insert. Machine(machine. Balance); ut. commit(); } catch (Exception ex) { try { ut. rollback(); } catch (System. Exception syex) { throw new EJBException ("Rollback failed: " + syex. get. Message()); } throw new EJBException ("Transaction failed: " + ex. get. Message()); } }
Metody zabronione Metoda get. Rollback. Only() Metoda set. Rollback. Only() z EJBContext interface (metody te powinny być używane tylko w transakcjach zarządzanych kontenerem)
Podsumowanie transakcji dla EJB Standardowym ustawieniem transakcji jest sterowanie kontenerem z opcja required.
Transaction Timeouts n W pliku domain. xml można ustawić timeout po którym rozpoczęta transakcja zostanie anulowana. Odpowiada za to kontroler EJB Ustawienie tego parametru na wartość 0 wyłącza timeout. n Funkcje ta można ustawić tylko w transakcjach sterowanych kontenerem.
Poziomy izolacji (widocznosci modyfikowanych danych) n Poziom izolacji beanow encji sterowanych kontenerem modyfikowany jest w pliku sun-cmp-mapping. xml i standardowo ustawiony jest na READ_COMMITED dla wszystkich rodzajów beanow, ale przy transakcjach sterowanych beanem do ustawiania poziomu izolacji służy metoda: con. set. Transaction. Isolation(TRANSACTION_READ_UNCOMMITTED)
Uaktualnianie wielu baz danych n J 2 EE gdy kontener zarządza transakcjami oraz przy użyciu JTA (zarządzaniu beanami) n 2 rodzaje rozwiązań
- Slides: 18