在我的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:
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方法中启动的所有者事务向方法中的数据库提交更改。现在,任何更改都会在出现异常的情况下回滚。
validateBoard
即使@Transactional(propagation = Propagation.REQUIRES_NEW)它不起作用。
@Transactional(propagation = Propagation.REQUIRES_NEW)
如何使用Spring正确执行此操作并允许嵌套事务?
本文档涵盖了您的问题-https://docs.spring.io/spring-framework/docs/current/spring- framework-reference/data-access.html#transaction-declarative- annotations
在代理模式(默认设置)下,仅拦截通过代理传入的外部方法调用。这意味着自调用实际上是目标对象中调用目标对象另一个方法的方法,即使调用的方法标记有@Transactional,也不会在运行时导致实际事务。另外,必须完全初始化代理以提供预期的行为,因此您不应在初始化代码(即@PostConstruct)中依赖此功能。
但是,有一个选项可以切换到AspectJ模式