Spring Transactions

33
Spring framework Motto: Musíte rozbít vejce když chcete udělat omeletu Spring framework training materials by Roman Pichlík is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License . 1 Sunday 13 May 2012

description

* ACID* Nested a Flat model transakcí* Lokální a distribuované transakce* Propagace a Izolace transakcí* Volba transakčního manažeru* Deklarativní ovládání transakcí* Programové ovládání transakcí

Transcript of Spring Transactions

Page 1: Spring Transactions

Spring frameworkMotto: Musíte rozbít vejce když chcete udělat omeletu

Spring framework training materials by Roman Pichlík is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

1Sunday 13 May 2012

Page 2: Spring Transactions

Řízení transakcíCommit, rollback, programové a deklarativní použití transakcí

2Sunday 13 May 2012

Page 3: Spring Transactions

Transakce

• Správné použití a pochopení transakcí je jednou ze základních výzev J2EE aplikací

• Transakce

• nedělitelná jednotka operace

• ACID

3Sunday 13 May 2012

Page 4: Spring Transactions

ACID

• Atomicity

• Consistency

• Isolation

• Durability

4Sunday 13 May 2012

Page 5: Spring Transactions

Transakce v Jave

• Každý framework nebo technologie má vlastní API

• JPA, Hibernate, JDBC, JTA...

• Transakce dělíme

• Lokální

• Globální

5Sunday 13 May 2012

Page 6: Spring Transactions

Transakce v Jave

• Vetšinou aplikací - lokální transakce

• autocommit

• řízení transakcí per connection

6Sunday 13 May 2012

Page 7: Spring Transactions

Lokální transakce

7Sunday 13 May 2012

Page 8: Spring Transactions

Autocommit mode• Defaultní chování JDBC

• Commit po každé operaci

• Možná nekonzistence dat

private void updateSomething() { Connection conn = null; Statement stmt = null; try { conn = ds.getConnection(); stmt = conn.createStatement(); stmt.executeUpdate("update table1"); stmt.executeUpdate("update table2"); } finally { DatabaseUtils.close(conn, stmt); }}

1

2

8Sunday 13 May 2012

Page 9: Spring Transactions

Manuální řízení

• Commit/Rollback programově

• Nutnost propagovat connection se započatou transakcí

private void updateSomething() { Connection conn = ds.getConnection();

Statement stmt = null; try { conn.setAutoCommit(false); stmt = conn.createStatement(); stmt.executeUpdate("update table1"); stmt.executeUpdate("update table2"); conn.commit(); } catch(Exception e) { conn.rollback(); } finally { DatabaseUtils.close(conn, stmt); }}

zahájení transakce

9Sunday 13 May 2012

Page 10: Spring Transactions

Globální transakce

10Sunday 13 May 2012

Page 11: Spring Transactions

JTA

• JTA je Java EE standard pro transakce

• Řízení

• Programové/Deklarativní

• Flat model

• Distribuované chování

11Sunday 13 May 2012

Page 12: Spring Transactions

Flat model• All or nothing princip

12Sunday 13 May 2012

Page 13: Spring Transactions

Nested model• Vnořená transakce může být rollbacknutá aniž

by muselo dojít k rollbacku celé transakce

13Sunday 13 May 2012

Page 14: Spring Transactions

Transakční atributy

• Transakce s různým chováním

• Propagace transakce

• Izolace transakce

• Rollback pravidla

14Sunday 13 May 2012

Page 15: Spring Transactions

Propagace

• Required

• RequiresNew

• Supports

• Mandatory

• NotSupported

15Sunday 13 May 2012

Page 16: Spring Transactions

Izolace• Určuje jak hodně se mohou

transakce ovlivnit

16Sunday 13 May 2012

Page 17: Spring Transactions

Read uncommited

17Sunday 13 May 2012

Page 18: Spring Transactions

Read commited

18Sunday 13 May 2012

Page 19: Spring Transactions

Read repeatable

19Sunday 13 May 2012

Page 20: Spring Transactions

Serializable

20Sunday 13 May 2012

Page 21: Spring Transactions

Transakce ve Springu

21Sunday 13 May 2012

Page 22: Spring Transactions

• Spring podporuje možnost definovat/ovládat transakce

• programově

• deklarativně

• Spring definuje abstraktní transakční API

• to umožňuje stejný přístup k řízení transakcí pro různé frameworky

• Hibernate, iBatis, JPA, JDBC

• V mnohém přebírá úspěšný koncept EJB

• CMT

• izolace, propagace

22Sunday 13 May 2012

Page 23: Spring Transactions

Transakční manažer• Pro využití transakcí musíme nadefinovat transakční manager beanu

• HibernateTransactionManager

• DataSourceTransactionManager

• JtaTransactionManager

• Podle typu transakčního manageru se definuje i jeho závislost

• DataSourceTransactionManager závisí na datasource

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"></property></bean>

23Sunday 13 May 2012

Page 24: Spring Transactions

Deklarativní řízení• Založeno na AOP

• Rollback RuntimteException

• XML

• Anotace

• @Transactional

24Sunday 13 May 2012

Page 25: Spring Transactions

XML

25Sunday 13 May 2012

Page 26: Spring Transactions

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

<aop:aspectj-autoproxy/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost/booking-demo?useUnicode=true&amp;characterEncoding=UTF-8"/> <property name="username" value="admin"/> <property name="password" value="changeit"/> </bean> <bean id="userStorageDaoJdbc" class="cz.bookingdemo.dao.UserStorageDaoJdbc" > <property name="dataSource" ref="dataSource"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- the transactional advice (i.e. what 'happens'; see the <aop:advisor/> bean below) --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- the transactional semantics... --> <tx:attributes> <!-- all methods starting with 'get' are read-only --> <tx:method name="get*" read-only="true"/> <!-- other methods use the default transaction settings (see below) --> <tx:method name="*"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="daoOperation" expression="execution(* cz.bookingdemo.dao.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="daoOperation"/> </aop:config></beans>

26Sunday 13 May 2012

Page 27: Spring Transactions

Anotace

27Sunday 13 May 2012

Page 28: Spring Transactions

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <bean class="cz.sweb.pichlik.springdao.hibernate.UserStorageDaoHibernate"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- ... Hibernate session ommited --> </beans>

@Transactional(readOnly=false, propagation = Propagation.REQUIRED)public class UserStorageDaoHibernate extends HibernateDaoSupport implements UserStorageDao {

public void delete(User user) { getHibernateTemplate().delete(user); }

@Transactional(readOnly= true) public User get(long userId) { return (User) getHibernateTemplate().get(User.class, userId); }}

28Sunday 13 May 2012

Page 29: Spring Transactions

Výjimky

• běhová (runtime) => vždy rollback

• kontrolovaná (checked) => neovlivňuje

• možno změnit chování viz atribut

• rollbackFor

• noRollbackFor

29Sunday 13 May 2012

Page 30: Spring Transactions

Programový způsob• Stará dobrá template method

• TransactionTemplate

• Méně flexibilní pro práci s except.

• netřeba explicitní commit/rollback

• RuntimeException

• status.setRoolbackOnly()30Sunday 13 May 2012

Page 31: Spring Transactions

TransactionTemplate tt = new TransactionTemplate(txManager); tt.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); tt.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { dao.save(user); dao.update(user); } });

31Sunday 13 May 2012

Page 32: Spring Transactions

Transakce test public class MyService {

@Transactional public void doSomething() { //code ommited... }

public void addSomething() { doSomething(); //code ommited... deleteSomething(); }

@Transactional protected void deleteSomething() { //code ommited... } }

32Sunday 13 May 2012

Page 33: Spring Transactions

• Nadefinujte pro předchozí DAO objekt transakce

• Vyzkoušejte programový způsob

• transakce nad vice metodami

• vyzkoušejte rollback

• Deklarativní způsob

• anotace

• XML

33Sunday 13 May 2012