2011-08-16 12 views
34

Ho un codice legacy che sto cercando di riutilizzare in primavera. Questo codice è profondamente annidato in un altro codice, quindi non è pratico riprogettarlo e viene chiamato in molte situazioni, alcune delle quali sono attraverso Spring. Quello che mi piacerebbe fare è usare la transazione Spring se ne è stata avviata una; in caso contrario, continuare a utilizzare il meccanismo di connessione db esistente (legacy). Il nostro primo pensiero è stato quello di rendere la nostra classe legacy un bean e utilizzare un iniettato TransactionPlatformManager, ma questo non sembra avere alcun metodo pertinente alla nostra situazione. Alcune ricerche hanno dimostrato che Spring ha una classe chiamata TransactionSynchronizationManager che ha un metodo statico isActualTransactionActive(). Il mio test indica questo metodo è un modo affidabile di rilevare se una transazione primavera è attiva:Esiste un modo migliore per rilevare se una transazione Spring DB è attiva rispetto all'utilizzo di TransactionSynchronizationManager.isActualTransactionActive()?

  • Quando chiamato tramite il servizio in primavera senza la @Transactional annotazione, restituisce false
  • Quando chiamato tramite il servizio in primavera con @Transactional, restituisce vero
  • Nel mio metodo eredità chiamato il modo attuale, restituisce false

la mia domanda: c'è un modo migliore di rilevare se una transazione è attiva?

risposta

37

Nessun modo migliore rispetto allo TransactionSynchronizationManager.isActualTransactionActive(). È il metodo di utilità utilizzato da primavera per gestire le transazioni. Anche se non è consigliabile utilizzarlo all'interno del tuo codice, per alcuni casi specifici dovresti - è per questo che è pubblico.

Un altro modo potrebbe essere utilizzare il gestore di entità/sessione/connessione e controllare lì se c'è una transazione esistente, ma preferirei il gestore di sincronizzazione.

+0

Grazie! È perfetto. – fool4jesus

Problemi correlati