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
@Transactionalles appels de méthode de service sont interceptés par leTransactionInterceptorAspect. -
Le
TransactionIntreceptordélègue la gestion des transactions auAbstractPlatformTransactionManagerimplémentation (JpaTransactionManagerdans votre cas). -
JpaTransactionManagerliera 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. -
JpaTransactionManagerutilise simplement leEntityManagerAPI 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.JdbcTransactionappels :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é (
DataSourceConnectionProviderdans 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.