Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA
Zbyněk Šlajchrt Část 9.
2
Transakce Jedna či více operací s jasným začátkem a koncem
Jednotka práce (unit of work) Operace v transakci musí být provedeny všechny, aby byl úkol splněn Selhání jedné operace je ekvivalentní selhání všech operací Příklad: Převod peněz z jednoho účtu na druhý Dvě základní operace: výběr ze zdrojového účtu a vklad na cílový účet Musí dojít k oběma operacím, aby se mohla transakce považovat za dokonanou Úvod atomičnosti
3
Transakce Na konci transakce musí být systém konzistentní
Za předpokladu konzistence na začátku, samozřejmě Součet vkladů na zdrojovém a cílovém účtu musí být stejný před i po provedení převodu Neprovedení jedné z operací by narušilo tento "zákon zachování" "Zákony zachování" = Invarianty (constraints) Invarianty nesmí mít narušeny V případě selhání nějaké operace v transakci se musí "zamést" již provedené změny Úvod konzistence a invariantů
4
Transakce Provádění transakce nesmí být rušeno souběžnými transakcemi
Převod peněz na účet nesmí být ovlivněn souběžně probíhajícím převodem na stejný účet. Výsledný efekt musí být stejný, jako kdyby tyto dvě transakce byly provedeny za sebou v libovolném pořadí Změny prováděné jednou transakcí nejsou viditelné v jiných transakcích Úvod izolace transakcí
5
Transakce Změny provedené úspěšnou transakcí musí být trvalé
I když dojde k výpadku elektrické energie, po re- startu systému musí být změny zachovány Během převodu peníze visí jaksi ve vzduchu. Po této choulostivé operaci jsou data (peníze) zpět v perzistentním úložišti. Úvod trvanlivosti transakcí
6
ACID vlastnosti transakcí
Atomicity Jednotka práce je nedělitelná – buď se provede celá, nebo vůbec Consistency "Zákony zachování" v systému zůstávají po transakci zachovány Isolation Souběžné transakce se vzájemně neovlivňují Durability Změny provedené úspěšnou transakcí jsou trvalé
7
Commit vs. Rollback Commit Rollback
Potvrzení změn provedených transakcí Může být voláno Explicitně aplikací – např. connection.commit() Automaticky, např. po kontejnerem po skončení metody nebo po každé operaci (Connection.setAutoCommit(true)) Rollback Odvolání změn provedených transakcí Explicitně aplikací – např. connection.rollback() Automaticky, např. kontejnerem při vyhození výjimky během transakce
8
Lokální transakce Application Např. JDBC nebo JMS
Resource Specific API Resource
9
Lokální transakce Transakce probíhající nad jedním perzistentním úložištěm (Resource) Např. práce s databází prostřednictvím JDBC nebo JMS Tato specifická API umožňují řízení transakcí Metody commit a rollback Zahájení transakce je často automatické – první operace nad úložištěm v rámci sezení od poslední transakce Ukončení transakce může být také automatické – viz. JDBC Connection.setAutoCommit(true)
10
Lokální transakce Application JTA Transaction Manager JTA
Resource Manager Např. JDBC nebo JMS, případně nestandardní API Resource
11
Lokální transakce Lze využít také obecné API pro řízení transakcí – Java Transaction API (JTA) Odhlíží od specifik perzistentních úložišť Transaction Manager Řídí průběh transakcí, koordinátor Umí řídit transakce nad více úložišti Resource Manager Reprezentant jednoho úložiště v transakčním systému Komunikuje s Transakčním manažerem 'Rozumí' specifickému úložišti
12
Lokální transakce nad databází
Application XAConnection JTA Transaction Manager XADataSource JTA Resource Manager JDBC Database
13
Globální transakce Application JTA Transaction Manager JTA/XA JTA/XA
Resource Manager Resource Manager Resource Resource
14
Globální transakce Transakce, které probíhají nad více než jedním úložištěm Výběr peněz z databáze o odeslání pomocí fronty Dvě různé technologie (JDBC, JMS) Dva různé produkty (Oracle DB, Sun Message Queue) Vzniká potřeba specifikovat komunikaci mezi heterogenními transakčními systémy (ACID) XA Specifikace, iniciativa Open Group Zavádí pojem DVOUFÁZOVÝ KOMIT Java Transaction API (JTA) podporuje XA v Javě
15
Globální transakce Application XAConnection A XAConnection B JTA
Transaction Manager XADataSourceA XADataSourceB JTA/XA JTA/XA Resource Manager A Resource Manager B JDBC JDBC Database A Database B
16
Dvoufázový komit Prepare phase Commit phase Resource Manager
2:prepared 4:committed Transaction Manager Transaction Manager 1:prepare 2:prepared Resource Manager 3:commit 4:committed Resource Manager Prepare fáze je obvykle náročnější, Commit by měla být co nejkratší
17
Distribuované transakce
Transakce, které probíhají mezi síťově propojenými systémy Převod peněz mezi dvěma bankami Fyzicky oddělené databáze Propojené přes internet Vzniká potřeba specifikovat komunikaci mezi síťově propojenými transakčními systémy Object Transaction Service (OTS) Iniciativa Object Management Group (OMG) Komunikace prostřednictvím protokolu IIOP Java Transaction Service (JTS) implementuje OTS v Javě
18
Distribuované transakce
Application Application JTA JTA Transaction Manager JTS/OTS Transaction Manager JTA/XA JTA/XA Resource Manager Resource Manager Resource Resource
19
Podpora transakcí v EJB
Programátor se nemusí zabývat složitostmi JTA a JTS jako jsou dvoufázový komit nebo propagování kontextu transakce mezi oddělenými systémy Dvě strategie Container-managed transaction (CMT) – DEFAULT Transakce je řízena kontejnerem Bean-managed transaction (BMT) Aplikace si řídí transakci sama
20
Container-Managed Transactions
CMT = Default mód Aplikace se nestará o vymezení transakce O vymezení transakce se stará kontejner K řízení transakcí používá metadata (anotace/XML)
21
Container-Managed Transactions
22
Transakční atributy Určují chování pro případ, že je metoda volána v již běžící transakci Příklad: metoda log na beanu LoggerBean
23
TA - default chování
24
Transakční atributy metod
Sdělují kontejneru, jaké mají metody požadavky na kontext transakce Kontejner může před voláním metody např. Vytvořit novou transakci Potlačit probíhající transakci Vyhodit výjimku, neboť metoda nesmí běžet v transakci Vyhodit výjimku, neboť metoda musí běžet v transakci Nedělat nic a volat metodu v probíhající transakci Nedělat nic a volat metodu bez transakce Anotace
25
REQUIRED Metoda musí být vždy volána v transakci
Pokud žádná transakce neběží, kontejner zahájí novou Používá se, pokud není jisté, že klient zahájil transakci
26
REQUIRES_NEW Metoda vyžaduje musí být spuštěna v nové transakci
Pokud je již nějaká transakce zahájena, kontejner ji pozastaví Na konci metody je původní transakce obnovena Použití Nechceme, aby selhání metody vyvolalo rollback probíhající transakce (nastavení setRollbackOnly()) Nechceme, aby selhání transakce po skončení metody vyvolalo rollback na změnách provedených metodou (např. logovací metoda zapisující do databáze)
27
SUPPORTS Metoda může, ale nemusí, běžet v transakci
Používá se, pokud metoda pouze čte z perzistentního úložiště (read-only metoda)
28
MANDATORY Metoda musí běžet v již probíhající transakci
V opačné případě je vyhozena výjimka javax.ejb.EJBTransactionRequiredException Použití: Pomocné metody volané z jiných metod (jiných beanů) běžících v transakci.
29
NOT_SUPPORTED Metoda není určena pro běh v transakci
Případná probíhající transakce je před voláním metody pozastavena a obnovena po návratu z metody Použití: V případech, kdy chci pozastavit transakci po dobu provádění metody Vzor Gateway: kromě metody save() musí být všechny ostatní volány mimo transakci, jinak by došlo k uložení stavu rozpracované entity do databáze
30
NEVER Metoda nesmí být volána v transakci.
Pokud je volána v probíhající transakce, je vyhozena výjimka javax.ejb.EJBException Použití: Ve vzoru Gateway: místo atributu NOT_SUPPORTED by se mohl použít přísnější atribut NEVER
31
Tabulka pro určení transakčního atributu metody
New Transaction Do Nothing Throw Exception Suspend Pending No Pending In A Pending Transaction Action Situation R S RN NS M N RN – REQUIRES_NEW R – REQUIRES S – SUPPORTS M – MANDATORY NS – NOT_SUPPORTED N - NEVER
32
Jak pracovat s tabulkou?
Při návrhu metody si musíme rozmyslet, co se očekává od kontejneru, že udělá ve dvou situacích: Metoda je volána mimo transakci Metoda je volána v probíhající transakci V obou případech je třeba rozhodnout, zda kontejner má Vytvořit novou transakci Nedělat nic Vyhodit výjimku Potlačit probíhající transakci (má smysl pouze v 2)
33
Jak pracovat s tabulkou?
Řádky v tabulce odpovídají situacím 1 a 2 Sloupce odpovídají požadovaným akcím kontejneru V obou řádkách vybereme jednu buňku Lze do ní psát zdůvodnění Symbol šipky spojující tyto dvě buňky identifikuje hledaný transakční atribut
34
Pro metodu LoggerBean::log
New Transaction Do Nothing Throw Exception Suspend Pending No Pending Provádí se zápis do databáze. In A Pending Transaction Nechceme, aby hláška zmizela, pokud se náhodou nepovede probíhající transakce. Výsledek: REQUIRES_NEW
35
LoggerBean::log
36
"Zavržení" transakce Při používání CMT se programátor nestará o zahájení transakce ani commit a rollback Nemá k tomu ani prostředky Někdy je zapotřebí oznámit kontejneru, že se musí provést rollback, který by se jinak neprovedl
37
SetRollbackOnly - použití
Business logika chce provést rollback, ale nevyhazovat nekontrolovanou výjimku Před jejím vyhozením se zavolá SessionContext.setRollbackOnly() Business logika zjistí nějaký nesoulad a chce vyhodit kontrolovanou výjimku, která standardně nezpůsobí rollback SessionContext lze injektovat @Resource SessionContext ctx;
38
Použití setRollbackOnly()
39
Výjimky a transakce Aplikační výjimky Systémové výjimky
Vztahují se k business logice – např. kontrola parametrů Nevyvolávají automaticky rollback Potomci java.lang.Exception, nikoliv však java.lang.RuntimeException Systémové výjimky Způsobené selháním systému – JVM, JNDI, připojení k databázi, java.lang.NullPointerException Způsobí rollback Potomci java.lang.RuntimeException nebo java.rmi.RemoteException
40
@javax.ejb.ApplicationException
Touto anotací lze řídit chování kontejneru při vyhození anotované výjimky Atribut rollback určuje, zda má výjimka způsobit rollback Dědí z @ApplicationException Popis Exception není Nezpůsobí rollback - default rollback=true Způsobí rollback rollback=false Nezpůsobí rollback RuntimeException Způsobí rollback - default
41
Použití @ApplicationException
42
Transakce řízené aplikací (BMT)
Bean-managed transactions (BMT) Někdy je zapotřebí mít větší kontrolu nad granularitou transakcí, než nám umožňuje CMT BMT umožňuje explicitní vymezení transakcí JTA operacemi begin, commit, rollback BMT mód se nastaví anotací @javax.ejb.TransactionManagement na třídě beanu Hodnota: TransactionManagementType.BEAN
43
Použití BMT package cz.vse.javaee.prednaska9;
import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.EJBException; import javax.ejb.LocalBean; import javax.transaction.*; import java.math.BigDecimal; /** * <p/> * Created by IntelliJ IDEA. * User: zslajchrt * Date: Apr 10, 2010 * Time: 1:51:26 PM */ @LocalBean public class MoneyTransferBean { @EJB private AccountServiceLocal accountService; private LoggerBean logger; @Resource private UserTransaction ut; public void transfer(Account source, Account destination, BigDecimal amount) throws InsufficientFundsException { try { // log se volá ve své vlastní transakci logger.log("Begin transfer from " + source + " to " + destination); // withdraw a deposit běží ve jedné transakci ut.begin(); accountService.withdraw(source, amount); accountService.deposit(destination, amount); ut.commit(); // log se volá v nové transakci logger.log("Successfully transferred "); } catch (Exception e) { ut.rollback(); logger.log("Problem with transfer: " + e.getMessage()); } } catch (NotSupportedException e) { throw new EJBException(e); } catch (SystemException e) {
44
Zdroje Burke, Bill – Monson-Haefel, Richard; Enterprise Java Beans 3.0; O'Reilly Goncalves, Antonio; Beginning Java EE 6 Platform With GlassFish 3; APRESS
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.