@Transactional - czy działa poprawnie?

0

Hej, jako że @Transactional nie działa na metodach wołanych z tego samego beana, to czy takie przykład będzie działał tranzakcyjnie?

    interface BaseService {
        void doWork();
    }
    
    class BaseServiceImpl implements BaseService {

        DataFetcher dataFetcher;

        public BaseServiceImpl(DataFetcher dataFetcher) {
            this.dataFetcher = dataFetcher;
        }

        @Override
        public void doWork() {
            dataFetcher.fetch();
        }
    }
    
    interface DataFetcher {
        List<String> fetch();
    }

    class DataFetcherImpl implements DataFetcher {

        public List<String> fetchItems() {
           return fetch();
        }
        
        @Override
        @Transactional
        public List<String> fetch() {
            //fetchowanie danych
        }
    }

Teoretycznie fetch() jest wołany z tego samego beana czyli DataFetcher, no ale fetchItems() które woła tranzakcyjne fetch() jest wołane już z innego beana BaseService.

Czy w takim wypadku jest to wywołanie tranzakcyjne i @Transactional dziala poprawnie?

0

Możesz sprawdzić to samemu - postaw breakpointa w metodzie fetch() i sprawdź, czy w stracktrace będzie proxy Springowe TransactionInterceptor. Ale nie zobaczysz go, ponieważ tutaj ta metoda jest bezpośrednio wołana z tej samej klasy, z metody fetchItems. Miejsce wywołania metody fetchItems nie ma znaczenia.

6

Jeśli z innego beana wywołasz DataFetcherImpl.fetchItems() to @Transactional na fetch** raczej nie zadziała, ale pewności nie ma** (możesz mieć tzw. aspectj włączony).
Jeśli z innego beana wywołasz DataFetcherImpl.fetch() to @Transactional na fetch** raczej zadziała, ale pewności nie ma** (możesz mieć wiele innych rzeczy źle ustawione).

0

A nie będzie tu miało jeszcze przypadkiem znaczenia jak dany bean zostanie utworzony? Tzn springowo (@Repository/@Component/coś tam jeszcze) czy "tradycyjnie" (jawnie new). W szczególności jak to będzie wyglądało gdy składamy sobie @Bean'y ręcznie w @Configuration.

0
jarekr000000 napisał(a):

Jeśli z innego beana wywołasz DataFetcherImpl.fetchItems() to @Transactional na fetch** raczej nie zadziała, ale pewności nie ma** (możesz mieć tzw. aspectj włączony).
Jeśli z innego beana wywołasz DataFetcherImpl.fetch() to @Transactional na fetch** raczej zadziała, ale pewności nie ma** (możesz mieć wiele innych rzeczy źle ustawione).

Dzięki za rozjaśnienie, a co w przypadku jeśli:

Jeśli z innego beana który już działa w transakcji wywołam DataFetcherImpl.fetchItems() to czy @Transactional na fetch będzie transakcyjnie wykonane? Tj. "podpięty" pod @Transactional z innego beana

0

Tak, jeśli metoda zostanie wywołana na proxy Springowym. Jeśli wołasz na innym beanie, który został wstrzyknięty przez Springa, to na 99% zadziała. Polecam czytanie dokumentacji.

0

Tak na marginesie wątku, już poza Springiem.

Czasem sobie przetestuję to i owo z EE "krzyżowo" na TomEE i Payarra.
Znaczna większość rzeczy chodzi jednakowo.
Tematy @ Transactional / JTA są z całego EE najbardziej przej...ne 1) Uciekam jak diabeł od święconej wody.

<small>1) oprócz ewentualnej zagubionej sesji JPA w sesji webowej.</small>

UPDATE: znalazłem

1 użytkowników online, w tym zalogowanych: 0, gości: 1