В моем проекте загрузки Spring я реализовал следующий метод службы:
@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;
}
внутри этого метода я использую другой метод службы, который называется 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);
}
Мне нужно внести изменения в базу данных в методе update
независимо от транзакции владельца, которая запущена в методе validateBoard
. В настоящее время любые изменения отскакивают назад в случае каких-либо исключений.
Даже с @Transactional(propagation = Propagation.REQUIRES_NEW)
он не работает.
Как правильно сделать это с помощью Spring и разрешить вложенные транзакции?