Spring - transakcje, a init-method (@PostConstruct)

Witajcie czytelnicy

Dzisiaj mam zamiar przedstawić Wam ciekawostkę na którą się napotkałem. Mam nadzieję, ze niektórym to pomoże w trakcie szukania błędu w swojej implementacji lub rozwiązania tego problemu.

Zjawisko

Miałem stworzonego bean'a w konfiguracji .xml'owej Spring'a z metodą inicjującą. Ustawiłem na tej metodzie @Transactional(propagation=Propagation.REQUIRED) i myślałem, że wszystko działa. W trakcie implementacji tej metody, użyłem innego serwisu, który wymagał transakcji @Transactional(propagation=Propagation.MANDATORY). Nie widzieliście mojego zdziwienia jak dostałem wyjątkiem na twarz o treści:

org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'.

Wiedziałem czego dotyczy błąd, ale nie wiedziałem dlaczego go otrzymuje skoro mam transakcje.

Zaczęło się szukanie

Pierwszy pomysł, "może coś źle napisałem?". Zerkam na kod. Jest ok.

Drugi to, "może konfiguracja coś zmienia lub klasa jest w innym pakiecie co jest obsługiwany przez transakcje?", ale tutaj też ok.

Spojrzałem na to i sobie myślę, że "może problem jest z tym, że używam tej metody jako inicjującej?". BINGO, pierwszy wpis na Stacu, że ktoś ma ten sam problem, ale z @PostConstruct. Zagłębiam się dalej i czytam odpowiedź na forum Spring'a o treści:

"In the @PostConstruct (as with the afterPropertiesSet from the InitializingBean interface) there is no way to ensure that all the post processing is already done, so (indeed) there can be no Transactions. The only way to ensure that that is working is by using a TransactionTemplate."

I co z tego wynika?

Problemem jest fakt, że funkcje inicjujące nie mają transakcji.

Jak rozwiązałem ten problem?

Wystarczy stworzyć nowy serwis, który będzie posiadał metodę publiczną z transakcją i ją po prostu wywołać. Zostanie wtedy właśnie uruchomiony mechanizm transakcji. Dlaczego nowy serwis i metoda publiczna? To temat na zupełnie nowy wpis.

Comments

Popular posts from this blog

Why TDD is bad practice?

How correctly imitate dependencies?

Software development using Angular 5 with Spring Boot