2011-08-16 17 views
34

Tengo un código heredado que ahora estoy tratando de volver a utilizar en primavera. Este código está profundamente anidado en otro código, por lo que no es práctico rediseñarlo y se lo llama en muchas situaciones, algunas de las cuales solo se realizan a través de Spring. Lo que me gustaría hacer es utilizar la transacción de Spring si se ha iniciado una; de lo contrario, continúe utilizando el mecanismo de conexión de db existente (heredado). Nuestro primer pensamiento fue hacer de nuestra clase heredada un frijol y usar un TransactionPlatformManager inyectado, pero eso no parece tener ningún método relacionado con nuestra situación. Algunas investigaciones mostraron que Spring tiene una clase llamada TransactionSynchronizationManager que tiene un método estático isActualTransactionActive(). Mi prueba indica que este método es una manera confiable de detectar si una transacción primavera está activo:¿Existe una forma mejor de detectar si una transacción Spring DB está activa que usar TransactionSynchronizationManager.isActualTransactionActive()?

  • Cuando llama a través del servicio de primavera sin el @Transactional anotación, devuelve falso
  • Cuando llama a través del servicio de primavera con @Transactional, devuelve verdadera
  • En mi método heredado llamado el camino existente, devuelve falso

mi pregunta: ¿hay una mejor manera de detectar si una transacción está activo?

Respuesta

37

No hay mejor manera que el TransactionSynchronizationManager.isActualTransactionActive(). Es el método de utilidad utilizado por la primavera para manejar las transacciones. Aunque no es aconsejable usarlo dentro de su código, en algunos casos específicos debería hacerlo, por eso es público.

Otra forma podría ser usar el administrador de la entidad/sesión/conexión y verificar si hay una transacción existente, pero preferiría el administrador de sincronización.

+0

¡Gracias! Eso es perfecto. – fool4jesus

Cuestiones relacionadas