Spring Transactions

Post on 20-Jan-2015

817 views 2 download

Tags:

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

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

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

2Sunday 13 May 2012

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

ACID

• Atomicity

• Consistency

• Isolation

• Durability

4Sunday 13 May 2012

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

Transakce v Jave

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

• autocommit

• řízení transakcí per connection

6Sunday 13 May 2012

Lokální transakce

7Sunday 13 May 2012

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

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

Globální transakce

10Sunday 13 May 2012

JTA

• JTA je Java EE standard pro transakce

• Řízení

• Programové/Deklarativní

• Flat model

• Distribuované chování

11Sunday 13 May 2012

Flat model• All or nothing princip

12Sunday 13 May 2012

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

by muselo dojít k rollbacku celé transakce

13Sunday 13 May 2012

Transakční atributy

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

• Propagace transakce

• Izolace transakce

• Rollback pravidla

14Sunday 13 May 2012

Propagace

• Required

• RequiresNew

• Supports

• Mandatory

• NotSupported

15Sunday 13 May 2012

Izolace• Určuje jak hodně se mohou

transakce ovlivnit

16Sunday 13 May 2012

Read uncommited

17Sunday 13 May 2012

Read commited

18Sunday 13 May 2012

Read repeatable

19Sunday 13 May 2012

Serializable

20Sunday 13 May 2012

Transakce ve Springu

21Sunday 13 May 2012

• 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

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

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

• Rollback RuntimteException

• XML

• Anotace

• @Transactional

24Sunday 13 May 2012

XML

25Sunday 13 May 2012

<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

Anotace

27Sunday 13 May 2012

<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

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

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

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

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

• 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