私が実装した以下のサービス方法:update
と呼ばれ、私は別のサービスメソッドを使用してこのメソッドの内部春のネストされたトランザクション私の春のブートプロジェクトで
@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;
}
:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Board update(Board board, Date finishedDate, Integer status) {
board.setStatus(status);
board.setFinishedDate(finishedDate);
return boardRepository.save(board);
}
私はコミットする必要がありますvalidateBoard
メソッドで開始された所有者トランザクションとは独立してupdate
メソッドのデータベースに変更されます。現在、例外が発生した場合、変更はすべてロールバックされます。
@Transactional(propagation = Propagation.REQUIRES_NEW)
であっても動作しません。
Springで正しくこれを行い、ネストされたトランザクションを許可する方法はありますか?
あなたは同じクラス内のメソッドを呼び出しているので、Springは呼び出しを傍受してトランザクションプロキシを適用できません( 'REQUIRES_NEW'伝播は無視されます)。 'update'メソッドを別のSpring beanに移行する必要があります。 –
ありがとうございます。 – alexanoid