Transakcje zarządzane kontenerem Kompatybilność z wszystkimi typami EJB jak:
description
Transcript of Transakcje zarządzane kontenerem Kompatybilność z wszystkimi typami EJB jak:
Transakcje zarządzane Transakcje zarządzane konteneremkontenerem
Kompatybilność z wszystkimi typami EJB jak:Kompatybilność z wszystkimi typami EJB jak:encji, sesyjne, sterowane komunikatami.encji, sesyjne, sterowane komunikatami.
Brak oznaczeń początku i końca transakcji w Brak oznaczeń początku i końca transakcji w kodzie EJBkodzie EJB
Prostota użycia.Prostota użycia. Kontener rozpoczyna transakcje tuz zaraz po Kontener rozpoczyna transakcje tuz zaraz po
uruchomieniu metody i zatwierdza ja tuz uruchomieniu metody i zatwierdza ja tuz przed jej zakończeniem.przed jej zakończeniem.
Pojedyncza metoda może być związana z co Pojedyncza metoda może być związana z co najwyżej jedna transakcja. (wiele bądź najwyżej jedna transakcja. (wiele bądź zagnieżdżone transakcje nie są dozwolone)zagnieżdżone transakcje nie są dozwolone)
Nie każda metoda musi być związana z Nie każda metoda musi być związana z transakcja. Podczas składowania beana transakcja. Podczas składowania beana określa się które metody będą wiązane z określa się które metody będą wiązane z transakcjamitransakcjami
Atrybuty transakcjiAtrybuty transakcji
Atrybuty transakcji kontrolują zasięg transakcjiAtrybuty transakcji kontrolują zasięg transakcji
Atrybuty transakcji mogą mieć wartość:Atrybuty transakcji mogą mieć wartość:
RequiredRequired RequiresNewRequiresNew MandatoryMandatory NotSupportedNotSupported SupportsSupports NeverNever
Atrybuty transakcji można zmieniać podczas Atrybuty transakcji można zmieniać podczas wielu faz rozwijania aplikacji (umieszczone w wielu faz rozwijania aplikacji (umieszczone w deployment descriptor)deployment descriptor)
Pierwszeństwo maja reguły ustalone dla konkretnej Pierwszeństwo maja reguły ustalone dla konkretnej metody beana przed regułami dotyczącymi ogólnie metody beana przed regułami dotyczącymi ogólnie całego beana.całego beana.
Reguły dla odpowiednich metod zależą od typu beanaReguły dla odpowiednich metod zależą od typu beana
Dla beanow sesyjnych można stosować transakcje do Dla beanow sesyjnych można stosować transakcje do business-role metod ale nie można do metod typu business-role metod ale nie można do metod typu createcreate
beany encji wymagają reguł dla metod typu: create, beany encji wymagają reguł dla metod typu: create, remove, business, i finderremove, business, i finder
Beany MDB wymagają reguł dla metody onMessageBeany MDB wymagają reguł dla metody onMessage
Wycofywanie transakcji zarzadzanych Wycofywanie transakcji zarzadzanych konteneremkontenerem
Wycofanie transakcji może być spowodowane Wycofanie transakcji może być spowodowane przez:przez:
Rzucenie wyjątku systemowegoRzucenie wyjątku systemowego Wywołanie metody setRollbackOnly() (rzucenie Wywołanie metody setRollbackOnly() (rzucenie
wyjątku metody nie spowoduje wycofania wyjątku metody nie spowoduje wycofania transakcji)transakcji)
Zmienne instancyjne w beanach encji Zmienne instancyjne w beanach encji przywracane są automatycznie poprzez przywracane są automatycznie poprzez wywołanie metody ejbLoadwywołanie metody ejbLoad
Zmienne sesyjne w beanach sesyjnych nie są Zmienne sesyjne w beanach sesyjnych nie są przywracane po wycofaniu transakcji i trzeba to przywracane po wycofaniu transakcji i trzeba to zrobić np poprzez interfejs synchronizacji sesji.zrobić np poprzez interfejs synchronizacji sesji.
public void transferToSaving(double amount) throws public void transferToSaving(double amount) throws InsufficientBalanceException {InsufficientBalanceException {
checkingBalance -= amount;checkingBalance -= amount;savingBalance += amount;savingBalance += amount;try {try {
updateChecking(checkingBalance);updateChecking(checkingBalance);if (checkingBalance < 0.00) {if (checkingBalance < 0.00) {
context.setRollbackOnly();context.setRollbackOnly();throw new InsufficientBalanceException();throw new InsufficientBalanceException();
}}updateSaving(savingBalance);updateSaving(savingBalance);
} catch (SQLException ex) {} catch (SQLException ex) {throw new EJBException ("Transaction failed due to throw new EJBException ("Transaction failed due to
SQLException: " + ex.getMessage());SQLException: " + ex.getMessage());}}
} }
Synchronizacja zmiennych Synchronizacja zmiennych instancyjnychinstancyjnych
bean-ów sesyjnychbean-ów sesyjnych
Metoda afterBegin()Metoda afterBegin()
public void afterBegin() {public void afterBegin() {System.out.println("afterBegin()");System.out.println("afterBegin()");try {try {
checkingBalance = selectChecking();checkingBalance = selectChecking();savingBalance = selectSaving();savingBalance = selectSaving();
} catch (SQLException ex) {} catch (SQLException ex) {throw new EJBException("afterBegin throw new EJBException("afterBegin
Exception: " + Exception: " + ex.getMessage());ex.getMessage());} }
} }
Metoda beforeCompletion()Metoda beforeCompletion() (ostatnia szansa na wycofanie transakcji)(ostatnia szansa na wycofanie transakcji)
Metoda afterCompletion()Metoda afterCompletion()
public void afterCompletion(boolean committed) public void afterCompletion(boolean committed) { System.out.println("afterCompletion: " + { System.out.println("afterCompletion: " + committed);committed);if (committed == false) {if (committed == false) {
try {try {checkingBalance = selectChecking(); checkingBalance = selectChecking(); savingBalance = selectSaving();savingBalance = selectSaving();
} catch (SQLException ex) {} catch (SQLException ex) {throw new throw new
EJBException("afterCompletion EJBException("afterCompletion SQLException: " + ex.getMessage());SQLException: " + ex.getMessage());
}}}}
} }
Metody niedozwolone w transakcjach Metody niedozwolone w transakcjach sterowanych konteneremsterowanych kontenerem
Metody commit, setAutoCommit, i rollbackMetody commit, setAutoCommit, i rollback
z java.sql.Connectionz java.sql.Connection
Metoda getUserTransaction z Metoda getUserTransaction z javax.ejb.EJBContextjavax.ejb.EJBContext
Jakakolwiek metoda z Jakakolwiek metoda z javax.transaction.UserTransactionjavax.transaction.UserTransaction
Transakcje zarzadzane beanamiTransakcje zarzadzane beanami
Ten rodzaj transakcji mogą mieć beany encji i Ten rodzaj transakcji mogą mieć beany encji i sesyjnesesyjne
Jawnie wewnątrz beana podaje się początek i Jawnie wewnątrz beana podaje się początek i koniec transakcjikoniec transakcji
Nie są już ograniczone na zagnieżdżone Nie są już ograniczone na zagnieżdżone transakcje jak w przypadku transakcji transakcje jak w przypadku transakcji zarządzanych konteneremzarządzanych kontenerem
Transakcje zarządzane przez beany musza być Transakcje zarządzane przez beany musza być obsługiwane albo przez JDBC albo JTAobsługiwane albo przez JDBC albo JTA
Transakcje JDBCTransakcje JDBC
Kontrolerem jest menadżer transakcji DBMSKontrolerem jest menadżer transakcji DBMS Metody commit i rollback z java.sql.ConnectionMetody commit i rollback z java.sql.Connection
Transakcje JTA (Java Transaction API)Transakcje JTA (Java Transaction API)
Są zarządzane przez menadżera transakcji J2EESą zarządzane przez menadżera transakcji J2EE Pozwala on np na obsługę wielu baz danych od Pozwala on np na obsługę wielu baz danych od
różnychróżnychdostawców. (praca z heterogeniczna baza)dostawców. (praca z heterogeniczna baza)
Minus J2EE nie wspomaga zagnieżdżonych Minus J2EE nie wspomaga zagnieżdżonych transakcjitransakcji
Metody begin, commit, i rollback z Metody begin, commit, i rollback z javax.transaction.UserTransactionjavax.transaction.UserTransaction
public void ship (String productId, String orderId, int public void ship (String productId, String orderId, int quantity) {quantity) {try {try {
makeConnection();makeConnection();con.setAutoCommit(false);con.setAutoCommit(false);updateOrderItem(productId, orderId);updateOrderItem(productId, orderId);updateInventory(productId, quantity);updateInventory(productId, quantity);con.commit();con.commit();
} catch (Exception ex) {} catch (Exception ex) {try {try {
con.rollback();con.rollback();throw new EJBException("Transaction failed: throw new EJBException("Transaction failed:
" + " + ex.getMessage());ex.getMessage());} catch (SQLException sqx) {} catch (SQLException sqx) {
throw new EJBException("Rollback failed: " throw new EJBException("Rollback failed: " + + sqx.getMessage());sqx.getMessage());
}}} finally { releaseConnection(); }} finally { releaseConnection(); }
}}
public void withdrawCash(double amount) {public void withdrawCash(double amount) {UserTransaction ut = context.getUserTransaction();UserTransaction ut = context.getUserTransaction();try {try {
ut.begin();ut.begin();updateChecking(amount);updateChecking(amount);machineBalance -= amount;machineBalance -= amount;insertMachine(machineBalance);insertMachine(machineBalance);ut.commit();ut.commit();
} catch (Exception ex) {} catch (Exception ex) {try {try {
ut.rollback();ut.rollback();} catch (SystemException syex) {} catch (SystemException syex) {
throw new EJBException ("Rollback throw new EJBException ("Rollback failed: " + failed: " + syex.getMessage());syex.getMessage());
}}throw new EJBException ("Transaction throw new EJBException ("Transaction
failed: " + failed: " + ex.getMessage());ex.getMessage());}}
} }
Metody zabronioneMetody zabronione
Metoda getRollbackOnly()Metoda getRollbackOnly()
Metoda setRollbackOnly()Metoda setRollbackOnly()
z EJBContext interfacez EJBContext interface
(metody te powinny być używane tylko w (metody te powinny być używane tylko w transakcjachtransakcjach
zarządzanych kontenerem)zarządzanych kontenerem)
Podsumowanie transakcji dla EJBPodsumowanie transakcji dla EJB
Standardowym ustawieniem transakcji jest Standardowym ustawieniem transakcji jest sterowanie kontenerem zsterowanie kontenerem z
opcja required.opcja required.
Transaction TimeoutsTransaction Timeouts
W pliku domain.xml można ustawić W pliku domain.xml można ustawić timeout po którym rozpoczęta transakcja timeout po którym rozpoczęta transakcja zostanie anulowana. Odpowiada za to zostanie anulowana. Odpowiada za to kontroler EJB Ustawienie tego parametru kontroler EJB Ustawienie tego parametru na wartość 0 wyłącza timeout.na wartość 0 wyłącza timeout.
Funkcje ta można ustawić tylko w Funkcje ta można ustawić tylko w transakcjach sterowanych kontenerem.transakcjach sterowanych kontenerem.
Poziomy izolacji Poziomy izolacji
(widocznosci modyfikowanych danych(widocznosci modyfikowanych danych))
Poziom izolacji beanow encji sterowanych Poziom izolacji beanow encji sterowanych kontenerem modyfikowany jest w pliku sun-cmp-kontenerem modyfikowany jest w pliku sun-cmp-mapping.xml i standardowo ustawiony jest na mapping.xml i standardowo ustawiony jest na READ_COMMITED dla wszystkich rodzajów READ_COMMITED dla wszystkich rodzajów beanow, ale przy transakcjach sterowanych beanow, ale przy transakcjach sterowanych beanem do ustawiania poziomu izolacji służy beanem do ustawiania poziomu izolacji służy metoda: metoda:
con.setTransactionIsolation(TRANSACTION_READ_UNCOcon.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED)MMITTED)
Uaktualnianie wielu baz danychUaktualnianie wielu baz danych
J2EE gdy kontener zarządza transakcjami oraz J2EE gdy kontener zarządza transakcjami oraz przy użyciu JTA (zarządzaniu beanami)przy użyciu JTA (zarządzaniu beanami)
2 rodzaje rozwiązań2 rodzaje rozwiązań