Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV) Katedra softwarového inženýrství Fakulta informačních technologií ČVUT v Praze Letní semestr 2010/2011, přednáška č. 5 Zdeněk Troníček, 2011
Agenda Transakce Řízení Zámky Izolační úrovně Security 2
Transakce (opak.) Transakce je posloupnost operací, která se tváří jako jedna velká, atomická operace. BEGIN COMMIT ROLLBACK převod peněz účet 1 účet 2 nákup v elektronickém obchodě: 1) platnost karty 2) zboží na skladě 3) platba kartou 4) expedice zboží 3
Programové řízení transakcí @Stateful @TransactionManagement( TransactionManagementType.BEAN ) public class ManagerBean implements ManagerLocal { @Resource UserTransaction ut; } public void addaccount( String type ) throws Exception { try { ut.begin();... ut.commit(); } catch ( Exception e ) { ut.rollback(); } } 4
Deklarativní řízení transakcí (1) @Stateful public class ManagerBean implements ManagerLocal {... @TransactionAttribute( TransactionAttributeType.REQUIRES_NEW ) public void addaccount( String type ) {... } } 5 Transaction attribute types: REQUIRED REQUIRES_NEW MANDATORY NEVER NOT_SUPPORTED SUPPORTS EJBObject BEGIN COMMIT Bean
Deklarativní řízení transakcí (2) @Stateful public class ManagerBean implements ManagerLocal { @Resource @Resource SessionContext SessionContext ctx; ctx;... public void addaccount( String type ) { if(... ) { } } ctx.setrollbackonly(); } if(... ) { } throw new EJBException( ); ); ROLLBACK 6
Transakční model Flat model (JEE) T1 begin Nested model T1 suspend nezávislá transakce T1 begin vnořená transakce T2 begin T2 begin T2 commit T2 commit T1 resume T1 rollback T1 rollback 7
Transakce - příklad 1 metodab REQUIRED 2 metodac REQUIRED T1 begin T2 begin metodaa REQUIRED 3 metodad REQUIRES_NEW 4 metodae REQUIRED T1 commit T2 commit T3 begin 5 metodaf NOT_SUPPORTED 6 metodag REQUIRED T3 commit 8
Zamykání dat (JavaDB) Zámky Shared (S) pro čtení Exclusive (X) pro zápis čas Transakce 1 begin zamkne řádek A (zámek X)... commit (uvolní zámek) Transakce 2 begin čeká na zámek k řádku A... zamkne řádek A (zámek X)... 9
Lost Update User 1 Account: 1 Balance: 123 124 User 2 Account: 1 Balance: 123 Brno Address: Praha Address: Praha 1 2 3 4 databáze 1: 1, 123, Praha 2: 1, 123, Praha 3: 1, 124, Praha 4: 1, 123, Brno 10
Pessimistic Locking User 1 Account: 1 Balance: 123 124 User 2 Account: 1 Balance: 124 Brno Address: Praha Address: Praha 1 3 2 4 1: zamkne řádek 2: uvolní zámek databáze 1: 1, 123, Praha 2: 1, 124, Praha 3: 1, 124, Praha 4: 1, 124, Brno 11
Optimistic Locking (1) přidáme sloupec verze před každou změnou zkontrolujeme číslo verze: pokud nesouhlasí, změnu odmítneme po každé změně zvýšíme číslo verze o 1 Account: 1 Balance: 123 Address: Praha Version: 1 124 2 1 2: je verze v DB rovna 1? databáze 12
Optimistic Locking (2) User 1 Account: 1 Balance: 123 124 User 2 Account: 1 Balance: 123 Brno Address: Praha Address: Praha Version: 1 Version: 1 1 2 3 4 databáze 1: 1, 123, Praha, 1 2: 1, 123, Praha, 1 3: 1, 124, Praha, 1 (2) 4: 1, 123, Brno, 1 13
Java Persistence API @Entity public class Account { @Version private Long version;... } Podporované typy @PersistenceContext private EntityManager em; // may throw OptimisticLockException public void updateaccount( Account acc ) { short, Short int, Integer long, Long Timestamp } em.merge( acc ); 14
Proč potřebujeme transakce? HOSPODY NÁZEV PIVO CENA Bar 11 Budvar 20 Bar 11 Kozel 25 současně: Rumcajs: (max) (min) Manka: (del) (ins) (max) SELECT MAX(CENA) FROM HOSPODY WHERE NÁZEV='Bar 11' SELECT MIN(CENA) FROM HOSPODY WHERE NÁZEV='Bar 11' (min) DELETE FROM HOSPODY WHERE NÁZEV='Bar 11' INSERT INTO HOSPODY VALUES( 'Bar 11', 'Radegast', 30 ) (del) (ins) 15
Řazení operací Nepoužijeme-li transakce, pak jediná omezení jsou: (max) před (min) (del) před (ins) Může tedy nastat: (max)(del)(ins)(min) (del) (ins) (min) Bar 11 Bar 11 Budvar Kozel 20 25 (max): 25 (del) (ins) Bar 11 Radegast 30 (min): 30 max < min 16
Řešení: transakce (max) a (min) provedeme v transakci 25 (max) (min) (del) (ins) 20 (del) (max) (min) (ins) NULL NULL (del) (ins) (max) (min) 30 30 17
Shared Locks Long duration begin lock row A Short duration begin lock row A commit release lock release lock commit zámky držíme do konce transakce zámky uvolníme bezprostředně po vyčtení dat 18
Phantom ACCOUNT ID BALANCE 1 101 T1 BEGIN SELECT * FROM ACCOUNT WHERE BALANCE>100 vybere 1 řádek 2 50 T2 BEGIN 3 105 INSERT INTO ACCOUNT VALUES( 3, 105 ) T2 COMMIT SELECT * FROM ACCOUNT WHERE BALANCE>100 vybere 2 řádky 19
Non-repeatable Read ACCOUNT ID BALANCE 1 101 T1 BEGIN SELECT * FROM ACCOUNT WHERE BALANCE>100 uvolníme zámky 2 50 T2 BEGIN ACCOUNT ID BALANCE 1 200 2 50 UPDATE ACCOUNT SET BALANCE=200 WHERE ID=1 T2 COMMIT SELECT * FROM ACCOUNT WHERE BALANCE>100 vrátí jiný výsledek 20
Izolační úrovně úroveň long duration short duration SERIALIZABLE REPEATABLE_READ X, S X, S zamyká predikáty READ_COMMITTED X S READ_UNCOMMITTED X nepoužívá zámky S nižší izolace vyšší souběžnost (concurrency) anomálie: phantoms non-repeatable read dirty read 21
Izolační úrovně v Javě Connection: settransactionisolation( int level ) TRANSACTION_SERIALIZABLE TRANSACTION_REPEATABLE_READ TRANSACTION_READ_COMMITTED TRANSACTION_READ_UNCOMMITTED izolační úroveň určuje, jak vidíme DB SERIALIZABLE READ_COMMITTED DB 22
Distribuované transakce javax.transaction javax.transaction.xa XAResource Resource Manager 1 Application Transaction Manager Resource Manager 2 23 XAResource xar = r1.getxaresource(); xar.start( xid1 );... xar.end( xid1 ); xar.start( xid2 );... xar.end( xid2 ); Resource Manager 3 2-phase commit
Security Základní pojmy autentizace = ověření totožnosti autorizace = přidělení práv confidentiality integrity Vlastnosti container-managed role-based end-to-end 24 @Stateless @DeclareRoles( "manager" ) public class BankManager {... @RolesAllowed( "manager" ) public void addcustomer(... ) {... } } @DeclareRoles @RolesAllowed @PermitAll @DenyAll
Uživatelské role Uživatelé aplikačního serveru user 1 user 2 user 3 Role Manager Případy užití Create Account Group 1 user 4 user 5 user 6 Customer Show Account 25 aplikační server JEE aplikace
Autentizace v HTTP HTTP BASIC nešifrované HTTP DIGEST - pouze kontrolní součet Form Based HTTPS Client - používá certifikáty Formulářová autentizace: <form method="post" action="j_security_check"> <input type="text" name="j_username"> <input type="password" name="j_password"> <input type="submit" value="login"> </form> 26
Certifikáty Kryptografie symetrická (tajný klíč) asymetrická (soukromý a veřejný klíč) Algoritmy DES RSA MD5, SHA Certifikát veřejný klíč jméno vlastníka platnost do název vydavatele (CA) sériové číslo digitální podpis Certificate Sign Request Certificate Certifikační autorita 27
Otázky & odpovědi tronicek@fit.cvut.cz