[Java eeconf 2016] spring jta principles of work with transactions. Dmytro Sokolov

79
Spring JTA: Principles of work with transactions .com

Transcript of [Java eeconf 2016] spring jta principles of work with transactions. Dmytro Sokolov

Page 1: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

Spring JTA: Principles of work with transactions.com

Page 2: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Dmytro Sokolov▷10 years Java Developer▷3 years Trainer & Mentor▷Java Trainer / Lead Software Engineer

▷Full-stack experience▷Project: BecomeJavaSenior.com▷email: [email protected]

Hello!

.com

Page 4: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Agenda▷The internal structure of Spring JTA;

▷Possible configuration with Spring AOP;

▷Transaction Concepts

▷Benefits of Spring JTA

▷Best Practices and pitfalls

Page 5: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

The internal structure of Spring JTA

Page 6: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

TransactionWhat transaction models do you know?

Page 7: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Local Transaction model with JDBC

connection.setAutoCommit(false);

preparedStatement.executeUpdate();

connection.commit();

} catch (SQLException e) {

connection.rollback();

Page 8: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Programmatic Transaction model with JPA

UserTransaction utx =

entityManager.getTransaction();

try {

utx.begin();

businessLogic();

utx.commit();

} catch(Exception ex) {

utx.rollback();

throw ex;

Page 9: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Declarative Transaction model with Spring

?

Page 11: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

@Transactional

Page 12: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

@Transactional

Page 13: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

@TransactionalWhat does

do ?

Page 14: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Bean registrationWhat does

do ?

1.ExecuteAopAutoProxyConfigurer.configureAutoProxyCreator()

Page 15: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Bean registrationWhat does

do ?

2. Which createTransactionInterceptor

Page 16: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Bean registrationWhat does

do ?

3. Search declared TransactionManager and attached it to TransactionInterceptor

Page 17: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Bean registrationWhat does

do ?

4. Register TransactionInterceptor bean in Spring Context

Page 18: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

@Transactional parsingHow @Transactional annotation is parsed during runtime by Spring?

Page 19: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

@Transactional parsingHow @Transactional annotation is parsed during runtime by Spring?

Registers the SpringTransactionAnnotationParser as default parser for the @Transactional annotation

Page 20: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transactional interceptor invocation

What does TransactionInterceptor do?

Page 21: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transactional interceptor invocation

What does TransactionInterceptor do?

1.Retrieves the transaction attributes

txAttr = getTransactionAttributeSource().

getTransactionAttribute(invocation.getMetho

d(), targetClass);

Page 22: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transactional interceptor invocation

What does TransactionInterceptor do?

2. Gets the transaction manager from the Spring context and transaction attributes

PlatformTransactionManager tm =

determineTransactionManager(txAttr);

Page 23: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transactional interceptor invocation

What does TransactionInterceptor do?

4. A transaction is created by the underlying entity managerTransactionInfo txInfo =

createTransactionIfNecessary(tm, txAttr,

joinpointIdentification);

Page 24: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transactional interceptor invocation

What does TransactionInterceptor do?

5. The target method is invoked retVal = invocation.proceed();

} catch (Throwable ex)

{ completeTransactionAfterThrowing(txInfo,

ex);

throw ex;

Page 25: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transactional interceptor invocation

What does TransactionInterceptor do?

5. The transaction is committed commitTransactionAfterReturning(txInfo);

Page 26: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transactional interceptor invocation

What does AbstractPlatformTransactionManager do?

Page 27: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

TransactionManager invocation

What does AbstractPlatformTransactionManager do?

Delegates the creation and the start of the transaction itself to the underlying JpaTransactionManager.

Page 28: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

TransactionManager invocation

What does JpaTransactionManager do?

Page 29: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

TransactionManager invocation

What does JpaTransactionManager do?

1. Tries to look an existing entity manager using the entity manager factory

EntityManagerHolder emHolder =

TransactionSynchronizationManager.getResource

( getEntityManagerFactory());

Page 30: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

TransactionManager invocation

What does JpaTransactionManager do?

2. Retrieves the dataSource declared for this transaction manager

ConnectionHolder conHolder =

TransactionSynchronizationManager.getResource

( getDataSource());

Page 31: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

TransactionManager invocation

What does JpaTransactionManager do?

3. Delegates the creation of a new JDBC transaction to the underlying JPA Dialect

Object transactionData =

getJpaDialect().beginTransaction(...)

Page 32: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

TransactionManager invocation

What does JpaTransactionManager do?

4. Registers the current JDBC connection to the TransactionSynchronizationManager ThreadLocal map

TransactionSynchronizationManager.bindResour

ce(getDataSource(), conHolder);

Page 33: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

TransactionManager invocation

And finally execute:

beginTransaction(entityManager, definition);

prepareTransaction(entityManager, ...);

commitTransactionAfterReturning(...);

Page 34: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Possible configuration with

Spring AOPDEMO

Page 35: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction Concepts

Page 36: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

X/Open XA standardXA (eXtended Architecture) ishow one/multiple resources is integrating with a transaction manager

Page 37: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

X/Open XA standardsupports both the 1-phase commit protocol and the 2-phase commit protocol.

Page 38: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Managing single or multiple resources

single resource - 1-phase commit multiple resources - 2-phase commit

Page 39: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

X/Open XA standardResources that support the XA standard expose a special object, the XA switch Interface javax.transaction.xa.XAResource

Page 40: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transactions and threadingTransactions are thread-specific

Page 41: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction contextAt a minimum, the transaction context contains a unique transaction identifier.

Depends on the relevant transaction manager implementation

Page 42: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction managerThe features determine the quality of service of a transaction manager:▷Support for multiple resources

▷Distributed transactions▷Transaction monitoring▷Recovery from failure▷Support for suspend/resume and attach/detach

Page 43: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction managers in Spring

Page 44: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction managers in Spring

+ JdoTransactionManagerJmsTransactionManager,WebLogicJtaTransactionManagerWebSphereUowTransactionManager

Page 45: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction managers in Spring

PlatformTransactionManager Interface

getTransaction(TransactionDefinition definition)void commit(TransactionStatus status) void rollback(TransactionStatus status)

Page 46: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction managers in Spring

TransactionDefinition interface

isolation level and the propagation policy

Page 47: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction managers in Spring

TransactionStatus interface

check the status of the current transaction

Page 48: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction managers in Spring

AbstractPlatformTransactionManager class

▷determines transaction;▷applies propagation behavior;▷suspends and resumes transactions;▷checks the rollback-only flag on commit;

Page 49: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Local transaction managers in Spring

can coordinate transactions over a single resource only

typically embedded in the resource itself

Page 50: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Local transaction managers in Spring JDBC

Spring Transaction ManagerJDBC resource

Oracle DB

built-in TransactionManager

BEGIN, COMMIT, ROLLBACKnative Oracle API

Page 51: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Local transaction managers in Spring JMS

Spring Transaction Manager(facade)Resource

instance of the JMS queues

topics

Page 52: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Spring Transaction Architecture

Standalone Spring container

Page 53: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Global transaction managers in Spring

Global transaction manager is TP monitor(transaction processing monitor )

▷implements the 2-phase commit

▷coordinate multiple XA resources

Page 54: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Global transaction managers in Spring

JtaTransactionManagerOC4JJtaTransactionManagnerWebLogicJtaTransactionManagerWebSphereUowTransactionManager

Page 55: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Global transactions with JTA

Page 56: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Spring Transaction Architecture

J2EE container deployment

Page 57: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Global transactions with JTA

To manage custom global JDBC and JMS transaction see opensource Atomikos or Bitronix

Page 58: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Distributed transaction managers in Spring

Distributed transaction managers does not supported from boxOutside the scope of the Spring framework.

Page 59: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Benefits of Spring JTAvs EJB

Page 60: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Spring JTA benefitsWork with ▷JTA transactions▷JDBC ▷JPA▷Hibernate ▷JDO ▷JMS

Page 61: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Spring JTA benefitsAOP declarative transaction management

Page 62: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Spring JTA benefitsProgrammatic transaction management

Page 63: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Spring JTA benefitsOffers declarative rollback rules

Page 64: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Spring JTA benefitsCustomize transactional behavior

▷insert custom behavior in the case of transaction rollback

▷add arbitrary advice▷rollback the transaction automatically on an application exception

Page 65: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Spring JTA benefitsDo not depends from Application Server

Page 66: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Spring JTA benefitsNo needs transaction-related JNDI lookups

Page 67: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Best Practicesand pitfalls

Page 68: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Declarative definition has logic

Page 69: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Different behavior for diff Tx Managers

@Transactional(readOnly = true, propagation=Propagation.REQUIRED)

public long insertTrade(TradeData trade) throws Exception { //JDBC code...}

Page 70: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Different behavior for diff Tx Managers

Not always the same:@Transactional(readOnly = true, propagation=Propagation.REQUIRED)

public long insertTrade(TradeData trade) throws Exception { em.persist(trade); return trade.getTradeId();}

Page 71: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Be aware of Propagation behavior

@Transactional(readOnly = true, propagation=Propagation.SUPPORT)public long insertTrade(TradeData trade) throws Exception { //JDBC code...}

Allows to write data

Page 72: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Be aware of Propagation behavior

@Transactional(readOnly = true)public TradeData getTrade(long tradeId) throws Exception { return em.find(TradeData.class, tradeId);}

Will use Propagation.REQUIREDDo you really need transaction for reading?

Page 73: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Be aware of Propagation behavior

How about

@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)public TradeData getTrade(long tradeId) throws Exception { return em.find(TradeData.class, tradeId);}

Page 74: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Be aware of Propagation behavior

Or even no transaction public TradeData getTrade(long tradeId) throws Exception { return em.find(TradeData.class, tradeId);

Page 75: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Be aware of Propagation behavior

@Transactional(propagation=Propagation.REQUIRES_NEW)public long insertTrade(TradeData trade) throws Exception {...}

@Transactional(propagation=Propagation.REQUIRES_NEW)public void updateAcct(TradeData trade) throws Exception {...}

Do you really need always new Transaction?

Page 76: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Rollback behavior@Transactional(propagation=Propagation.REQUIRED)public TradeData placeTrade(TradeData trade) throws Exception { try { insertTrade(trade); updateAcct(trade); return trade; } catch (Exception up) { //log the error throw up; }Will transaction Rollback in case of throw Exception?

Page 77: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Rollback behavior@Transactional(propagation= Propagation.REQUIRED, rollbackFor=Exception.class)public TradeData placeTrade(TradeData trade) throws Exception { try { insertTrade(trade); updateAcct(trade); return trade; } catch (Exception up) { //log the error throw up; }}

Page 78: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

.com

Transaction isolation@Transactional(propagation= Propagation.REQUIRED, Isolation = Isolation.REPEATABLE_READ)public long insertTrade(TradeData trade) throws Exception { //JDBC or JPA code...}

Will isolation always be changed?

Page 79: [Java eeconf 2016] spring jta  principles of work with transactions. Dmytro Sokolov

Thanks!Any questions?You can find me at:

[email protected]

.com