Není to vůbec složité.
-
Nejprve musíte pochopit, že správce transakcí Spring je pouze abstrakcí správy transakcí. Ve vašem případě se skutečné transakce odehrávají na úrovni připojení JDBC.
-
Vše
@Transactional
volání metody služby jsou zachycenyTransactionInterceptor
Poměr. -
TransactionIntreceptor
deleguje správu transakcí na aktuálně nakonfigurovanýAbstractPlatformTransactionManager
implementace (JpaTransactionManager
ve vašem případě). -
JpaTransactionManager
sváže aktuální probíhající jarní transakci s EntityManager, takže všechny DAO účastnící se aktuální transakce sdílejí stejný trvalý kontext. -
JpaTransactionManager
jednoduše používáEntityManager
Transaction API pro řízení transakcí:EntityTransaction tx = txObject.getEntityManagerHolder().getEntityManager().getTransaction(); tx.commit();
JPA Transaction API jednoduše deleguje volání na základní metody potvrzení/vrácení připojení JDBC.
-
Po dokončení transakce (commit/rollback) se
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction
volání:transactionCoordinator().getTransactionContext().managedClose();
což spustí zavření relace Hibernate (Entity Manager).
-
Podkladové připojení JDBC je proto spuštěno k uzavření také:
jdbcCoordinator.close();
-
Hibernate má logický popisovač připojení JDBC:
@Override public Connection close() { LOG.tracev( "Closing JDBC container [{0}]", this ); if ( currentBatch != null ) { LOG.closingUnreleasedBatch(); currentBatch.release(); } cleanup(); return logicalConnection.close(); }
-
Logické připojení deleguje zavřít volání na aktuálně nakonfigurovaného poskytovatele připojení (
DataSourceConnectionProvider
ve vašem případě), který jednoduše zavolá metodu close na připojení JDBC:@Override public void closeConnection(Connection connection) throws SQLException { connection.close(); }
-
Stejně jako u jakéhokoli jiného DataSource sdružujícího připojení, uzavření připojení JDBC jednoduše vrátí připojení k fondu a neuzavře fyzické připojení k databázi. Důvodem je to, že DataSource sdružování připojení vrací proxy připojení JDBC, které zachycuje všechna volání a deleguje uzavření na logiku zpracování fondu připojení.
Pamatujte, že pro transakce RESOURCE_LOCAL byste měli také nastavit hibernate.connection.provider_disables_autocommit
vlastnost if autocommit
kontrola byla zakázána fondem připojení. Tímto způsobem budou databázová připojení získána líně před provedením SQL dotazu nebo vyprázdněním Persistence Context.