Dlaczego Transaction na metodzie nie działa - prośba o wytłumaczenie

0

Cześć,

Mam takie dwie metody. Teraz gdy anotacja @Transactional jest za komentowana dla metody fillDatabaseWithData i jest odpalana metoda fillDataBaseWithStocks. Metoda nie jest zawierana w transakcji i do bazy po każdej iteracji leci zapis. Natomiast jak ustawie Transactional nad metodą fillDatabaseWithData cała metoda fillDataBaseWithStocks jest transakcyjna i działa poprawnie, zapis dopiero po skończeniu iteracji. Wytłumaczy mi ktoś dlaczego się tak dzieje?

//    @Transactional
    public ResponseEntity<Void> fillDatabaseWithData(Type type) {
        switch (type) {
            case STOCK:
                return fillDataBaseWithStocks();
            case STOCK_DETAILS:
                return fillDataBaseWithStockDetails();
            case STOCK_DETAILS_FIVE_MINUTES:
                return fillDataBaseWithStockFiveMinutesDetails();
            case STOCK_FINANCE_EVENTS:
                return fillDataBaseWithStockFinanceEvent();
            default:
                return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST);
        }
    }

    @Transactional
    public ResponseEntity<Void> fillDataBaseWithStocks() {
        for (StockTicker element : StockTicker.values()) {
            Stock stock = new Stock();
            stock.setTicker(element);
            stock = stockParser.setNameAndShortName(stock);
            stockRepository.save(stock);
        }
        fillDataStatusRepository.updateType(Type.STOCK.toString());
        return new ResponseEntity<Void>(HttpStatus.OK);
    }
0

Bo nie czytasz dokumentacji? Transactional ma parametry i default jest taki że jeśli jesteś już w aktywnej transakcji to nie otwierasz nowej tylko korzystasz z tej w której jesteś.

0

Tak to wiem, że nie otwieram nowej transakcji. Problem polega na tym, że mając użytą anotację @Transactional na metodzie fillDataBaseWithStocks() i tylko na niej, nie ma transakcji.

0

Ok teraz rozumiem o co pytasz. Niemożliwe. Jesteś pewien że commit leci co iteracje? Bo insert to nie to samo co commit...

0

Tak w 100% leci commit po każdej iteracji. Zrobiłem taki test w metodzie do parsowania 'name' dla jednej ze spółek zrobiłem żeby poleciał exception wtedy transakcja powinna zrobić rollback i tabelka powinna być pusta. Gdy @Transactional mam wyżej na metodzie działa poprawnie tabelka jest pusta, gdy @Transactional mam tylko na metodzie tabelka jest częściowo wypełniona do momentu exception, więc jakby transakcja nie miała miejsca. I to jest tylko jedyna rzecz którą zmieniam dodaję anotcję do metody wyżej.

1

Może chodzi o to, że wywołujesz jedną metodę z drugiej, ale obie są w tej samej klasie, więc wywołanie drugiej nie idzie przez proxy i @Transactional się nie wykona

0

Tak to jest to, jak przeniosłem metodę ze switch casem wyżej transactional działa prawidłowo. Chyba muszę poczytać dokładnie o proxy w springu, bo sporo czasu na tym straciłem.
Dzięki za pomoc:)

0

możesz wstrzyknąć samego siebie np przez SessionContext i wtedy bedzie gitara

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