В моей загрузки проекта 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 и разрешить вложенные транзакции?
Очевидно, вы вызываете метод в том же классе, поэтому Spring не может перехватить вызов и применить транзакционный прокси (распространение 'REQUIRES_NEW' игнорируется). Вы должны перенести метод 'update' в другой Spring bean, –
Спасибо, теперь все работает так, как ожидалось – alexanoid