180 likes | 282 Views
Transakcje zarządzane kontenerem Kompatybilność z wszystkimi typami EJB jak: encji, sesyjne, sterowane komunikatami. Brak oznaczeń początku i końca transakcji w kodzie EJB Prostota użycia.
E N D
Transakcje zarządzane kontenerem • 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 Atrybuty transakcji kontrolują zasięg transakcji
Atrybuty transakcji mogą mieć wartość: • Required • RequiresNew • Mandatory • NotSupported • Supports • Never Atrybuty transakcji można zmieniać podczas wielu faz rozwijania aplikacji (umieszczone w deployment descriptor)
Pierwszeństwo maja reguły ustalone dla konkretnej metody beana przed regułami dotyczącymi ogólnie całego beana. • Reguły dla odpowiednich metod zależą od typu beana • Dla beanow sesyjnych można stosować transakcje do business-role metod ale nie można do metod typu create • beany encji wymagają reguł dla metod typu: create, remove, business, i finder • Beany MDB wymagają reguł dla metody onMessage
Wycofywanie transakcji zarzadzanych kontenerem Wycofanie transakcji może być spowodowane przez: • Rzucenie wyjątku systemowego • Wywołanie metody setRollbackOnly() (rzucenie wyjątku metody nie spowoduje wycofania transakcji) • Zmienne instancyjne w beanach encji przywracane są automatycznie poprzez wywołanie metody ejbLoad • Zmienne sesyjne w beanach sesyjnych nie są przywracane po wycofaniu transakcji i trzeba to zrobić np poprzez interfejs synchronizacji sesji.
public void transferToSaving(double amount) throws InsufficientBalanceException { checkingBalance -= amount; savingBalance += amount; try { updateChecking(checkingBalance); if (checkingBalance < 0.00) { context.setRollbackOnly(); throw new InsufficientBalanceException(); } updateSaving(savingBalance); } catch (SQLException ex) { throw new EJBException ("Transaction failed due to SQLException: " + ex.getMessage()); } }
Synchronizacja zmiennych instancyjnych bean-ów sesyjnych • Metoda afterBegin() public void afterBegin() { System.out.println("afterBegin()"); try { checkingBalance = selectChecking(); savingBalance = selectSaving(); } catch (SQLException ex) { throw new EJBException("afterBegin Exception: " + ex.getMessage()); } }
Metoda beforeCompletion() (ostatnia szansa na wycofanie transakcji) • Metoda afterCompletion() public void afterCompletion(boolean committed) { System.out.println("afterCompletion: " + committed); if (committed == false) { try { checkingBalance = selectChecking(); savingBalance = selectSaving(); } catch (SQLException ex) { throw new EJBException("afterCompletion SQLException: " + ex.getMessage()); } } }
Metody niedozwolone w transakcjach sterowanych kontenerem • Metody commit, setAutoCommit, i rollback z java.sql.Connection • Metoda getUserTransaction z javax.ejb.EJBContext • Jakakolwiek metoda z javax.transaction.UserTransaction
Transakcje zarzadzane beanami • Ten rodzaj transakcji mogą mieć beany encji i sesyjne • Jawnie wewnątrz beana podaje się początek i koniec transakcji • Nie są już ograniczone na zagnieżdżone transakcje jak w przypadku transakcji zarządzanych kontenerem • Transakcje zarządzane przez beany musza być obsługiwane albo przez JDBC albo JTA
Transakcje JDBC • Kontrolerem jest menadżer transakcji DBMS • Metody commit i rollback z java.sql.Connection Transakcje JTA (Java Transaction API) • Są zarządzane przez menadżera transakcji J2EE • Pozwala on np na obsługę wielu baz danych od różnych dostawców. (praca z heterogeniczna baza) • Minus J2EE nie wspomaga zagnieżdżonych transakcji • Metody begin, commit, i rollback z javax.transaction.UserTransaction
public void ship (String productId, String orderId, int quantity) { try { makeConnection(); con.setAutoCommit(false); updateOrderItem(productId, orderId); updateInventory(productId, quantity); con.commit(); } catch (Exception ex) { try { con.rollback(); throw new EJBException("Transaction failed: " + ex.getMessage()); } catch (SQLException sqx) { throw new EJBException("Rollback failed: " + sqx.getMessage()); } } finally { releaseConnection(); } }
public void withdrawCash(double amount) { UserTransaction ut = context.getUserTransaction(); try { ut.begin(); updateChecking(amount); machineBalance -= amount; insertMachine(machineBalance); ut.commit(); } catch (Exception ex) { try { ut.rollback(); } catch (SystemException syex) { throw new EJBException ("Rollback failed: " + syex.getMessage()); } throw new EJBException ("Transaction failed: " + ex.getMessage()); } }
Metody zabronione Metoda getRollbackOnly() Metoda setRollbackOnly() 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 • 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. • Funkcje ta można ustawić tylko w transakcjach sterowanych kontenerem.
Poziomy izolacji (widocznosci modyfikowanych danych) • 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.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED)
Uaktualnianie wielu baz danych • J2EE gdy kontener zarządza transakcjami oraz przy użyciu JTA (zarządzaniu beanami) • 2 rodzaje rozwiązań