【发布时间】:2016-09-10 01:38:10
【问题描述】:
在我的 Spring Boot 项目中,我实现了以下服务方法:
@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, -
谢谢,现在一切正常
标签: spring spring-boot spring-data spring-data-jpa spring-transactions