Ce n'est pas compliqué du tout.
-
Tout d'abord, vous devez comprendre que le gestionnaire de transactions Spring n'est qu'une abstraction de la gestion des transactions. Dans votre cas, les transactions réelles se produisent au niveau de la connexion JDBC.
-
Tous
@Transactional
les appels de méthode de service sont interceptés par leTransactionInterceptor
Aspect. -
Le
TransactionIntreceptor
délègue la gestion des transactions auAbstractPlatformTransactionManager
implémentation (JpaTransactionManager
dans votre cas). -
JpaTransactionManager
liera la transaction Spring en cours d'exécution à un EntityManager, de sorte que tous les DAO participant à la transaction en cours partagent le même contexte de persistance. -
JpaTransactionManager
utilise simplement leEntityManager
API de transaction pour contrôler les transactions :EntityTransaction tx = txObject.getEntityManagerHolder().getEntityManager().getTransaction(); tx.commit();
L'API de transaction JPA délègue simplement l'appel aux méthodes de validation/annulation de la connexion JDBC sous-jacentes.
-
Lorsque la transaction est terminée (commit/rollback), le
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction
appels :transactionCoordinator().getTransactionContext().managedClose();
qui déclenche une fermeture de session Hibernate (Entity Manager).
-
La connexion JDBC sous-jacente est donc également déclenchée pour être fermée :
jdbcCoordinator.close();
-
Hibernate a un handle de connexion logique JDBC :
@Override public Connection close() { LOG.tracev( "Closing JDBC container [{0}]", this ); if ( currentBatch != null ) { LOG.closingUnreleasedBatch(); currentBatch.release(); } cleanup(); return logicalConnection.close(); }
-
La connexion logique délègue l'appel de fermeture au fournisseur de connexion actuellement configuré (
DataSourceConnectionProvider
dans votre cas), qui appelle simplement la méthode close sur la connexion JDBC :@Override public void closeConnection(Connection connection) throws SQLException { connection.close(); }
-
Comme toute autre connexion regroupant DataSource, la fermeture de connexion JDBC renvoie simplement la connexion au pool et ne ferme pas la connexion physique à la base de données. En effet, le pool de connexions DataSource renvoie un proxy de connexion JDBC qui intercepte tous les appels et délègue la fermeture à la logique de gestion du pool de connexions.
Notez que pour les transactions RESOURCE_LOCAL, vous devez également définir le hibernate.connection.provider_disables_autocommit
propriété si le autocommit
la vérification a été désactivée par le pool de connexion. De cette façon, les connexions à la base de données seront acquises paresseusement avant d'exécuter une requête SQL ou de vider le contexte de persistance.