No es nada complicado.
-
Primero, debe comprender que el administrador de transacciones de Spring es solo una abstracción de administración de transacciones. En su caso, las transacciones reales ocurren en el nivel de conexión JDBC.
-
Todo
@Transactional
las llamadas al método de servicio son interceptadas porTransactionInterceptor
Aspecto. -
El
TransactionIntreceptor
delega la gestión de transacciones alAbstractPlatformTransactionManager
implementación (JpaTransactionManager
en su caso). -
JpaTransactionManager
vinculará la transacción Spring en ejecución actual a un EntityManager, por lo que todos los DAO que participan en la transacción actual comparten el mismo contexto de persistencia. -
JpaTransactionManager
simplemente usa elEntityManager
API de transacciones para controlar transacciones:EntityTransaction tx = txObject.getEntityManagerHolder().getEntityManager().getTransaction(); tx.commit();
La API de transacciones de JPA simplemente delega la llamada a los métodos subyacentes de compromiso/reversión de la conexión JDBC.
-
Cuando se realiza la transacción (commit/rollback),
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction
llamadas:transactionCoordinator().getTransactionContext().managedClose();
que desencadena un cierre de sesión de Hibernate (Entity Manager).
-
Por lo tanto, la conexión JDBC subyacente también se activa para cerrarse:
jdbcCoordinator.close();
-
Hibernate tiene un controlador de conexión JDBC lógico:
@Override public Connection close() { LOG.tracev( "Closing JDBC container [{0}]", this ); if ( currentBatch != null ) { LOG.closingUnreleasedBatch(); currentBatch.release(); } cleanup(); return logicalConnection.close(); }
-
La conexión lógica delega la llamada de cierre al proveedor de conexión actualmente configurado (
DataSourceConnectionProvider
en su caso), que simplemente llama al método close en la conexión JDBC:@Override public void closeConnection(Connection connection) throws SQLException { connection.close(); }
-
Como cualquier otra fuente de datos de agrupación de conexiones, el cierre de la conexión JDBC simplemente devuelve la conexión al grupo y no cierra la conexión de la base de datos física. Esto se debe a que la fuente de datos de la agrupación de conexiones devuelve un proxy de conexión JDBC que intercepta todas las llamadas y delega el cierre a la lógica de manejo de la agrupación de conexiones.
Tenga en cuenta que para las transacciones de RECURSO_LOCAL, también debe configurar hibernate.connection.provider_disables_autocommit
propiedad si el autocommit
La verificación fue deshabilitada por el grupo de conexiones. De esta forma, las conexiones de la base de datos se adquirirán de forma perezosa antes de ejecutar una consulta SQL o vaciar el contexto de persistencia.