我正在尝试@Transactional
注释,但我不确定究竟是什么错误,我有以下代码
控制器
@RequestMapping(value = "/remove", method = RequestMethod.POST) void removeUserFlight(@RequestParam("flightId") Long flightId) throws Exception {
int affectedRows = userFlightDao.removeFlightByFlightId(flightId, user.getId());
throw new RuntimeException("Testing rollback?");
}
存储库
@Repository
public interface UserFlightDao extends CrudRepository<UserFlight, Long> {
/** Named DELETE query defined in {@link UserFlight} */
@Modifying @Transactional int removeFlightByFlightId(Long flightId, Long userId);
}
我的印象是,如果在执行行之后抛出异常,则不会删除记录。有人可以澄清这里有什么问题吗?
编辑:我也尝试将@Transactional放在Controller方法上,但没有区别。
edit2:试图将逻辑移动到Ralph下面建议的服务,它运行正常。我仍然不知道为什么控制器方法上的@Transactional直接不起作用。我会认为现在已经解决了,但我仍然感到困惑。
答案 0 :(得分:2)
您必须在事务中抛出异常。 (如果在事务已提交后抛出异常,则它将保持提交状态。)
默认情况下,事务会在离开已启动的方法时提交。
对于Testcase:添加带有Transaction注释的中间服务,然后在该服务方法中抛出异常。
@Service
public class IntermediateService() {
@Autowired
UserFlightDao userFlightDao;
@Transactional //maybe try propagation Requires_new
public void doMyTest() {
userFlightDao.removeFlightByFlightId(...);
throw new RuntimeException("Testing rollback?");
}
}