W moim projekcie Boot wiosennej I wprowadziły następujące metody usługa:Wiosna zagnieżdżone transakcje
@Transactional
public boolean validateBoard(Board board) {
boolean result = false;
if (inProgress(board)) {
if (!canPlayWithCurrentBoard(board)) {
update(board, new Date(), Board.AFK);
throw new InvalidStateException(ErrorMessage.BOARD_TIMEOUT_REACHED);
}
if (!canSelectCards(board)) {
update(board, new Date(), Board.COMPLETED);
throw new InvalidStateException(ErrorMessage.ALL_BOARD_CARDS_ALREADY_SELECTED);
}
result = true;
}
return result;
}
wewnątrz tej metody używam innej metody serwisowym, który nazywa update
:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Board update(Board board, Date finishedDate, Integer status) {
board.setStatus(status);
board.setFinishedDate(finishedDate);
return boardRepository.save(board);
}
muszę popełnić zmiany w bazie danych w metodzie update
niezależnie od transakcji właściciela, która jest uruchamiana w metodzie validateBoard
. Teraz wszelkie zmiany są wycofywane w przypadku jakiegokolwiek wyjątku.
Nawet z @Transactional(propagation = Propagation.REQUIRES_NEW)
nie działa.
Jak prawidłowo zrobić to za pomocą Spring i zezwolić na zagnieżdżone transakcje?
Wygląda na to, że wywołujesz metodę w obrębie tej samej klasy, więc Spring nie może przechwycić połączenia i zastosować proxy transakcyjne (propagacja typu "REQUIRES_NEW" jest ignorowana). Powinieneś przeprowadzić migrację metody 'update' do innej fasoli Spring, –
Dzięki, teraz wszystko działa zgodnie z oczekiwaniami – alexanoid