Spring Transactions
-
Upload
roman-pichlik -
Category
Spiritual
-
view
817 -
download
2
description
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&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