2011-08-16 2 views
34

Mam trochę starszego kodu, który próbuję ponownie użyć pod wiosną. Ten kod jest głęboko zagnieżdżony w innym kodzie, więc nie jest praktyczny do przeprojektowania i jest wywoływany w wielu sytuacjach, z których tylko niektóre są przez Spring. Chciałbym skorzystać z transakcji wiosennej, jeśli została rozpoczęta; w przeciwnym razie kontynuuj korzystanie z istniejącego (starszego) mechanizmu połączenia z bazą danych. Naszą pierwszą myślą było sprawić, aby nasza starsza klasa była fasolą i użyła wstrzykniętego TransactionPlatformManager, ale wydaje się, że nie ma ona żadnych metod istotnych dla naszej sytuacji. Niektóre badania wykazały, że Spring ma klasę o nazwie TransactionSynchronizationManager, która ma statyczną metodę isActualTransactionActive(). Moje badania wskazują, metoda ta jest niezawodnym sposobem na wykrycie, czy transakcja Wiosna jest aktywny:Czy istnieje lepszy sposób wykrywania, czy transakcja Spring DB jest aktywna niż przy użyciu TransactionSynchronizationManager.isActualTransactionActive()?

  • Wywołany przez służby Wiosna bez @Transactional adnotacji, zwraca false
  • Wywołany przez służby wiosną z @Transactional, zwraca prawda
  • W mojej starszej metody nazywane istniejącą drogę, zwraca false

Moje pytanie: Czy istnieje lepszy sposób na wykrycie, czy transakcja jest aktywna?

Odpowiedz

37

Nie ma lepszego sposobu niż TransactionSynchronizationManager.isActualTransactionActive(). Jest to metoda użyteczna wykorzystywana przez wiosnę do obsługi transakcji. Chociaż nie zaleca się używania go w ramach kodu, w niektórych szczególnych przypadkach powinieneś - dlatego jest on publiczny.

Innym sposobem może być użycie menedżera encji/sesji/połączenia i sprawdzenie, czy istnieje transakcja, ale wolałbym menedżera synchronizacji.

+0

Dziękujemy! To idealne. – fool4jesus