@Transactional没有处理抛出RuntimeException

时间:2015-10-19 10:52:24

标签: spring jpa spring-data

我正在尝试@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直接不起作用。我会认为现在已经解决了,但我仍然感到困惑。

1 个答案:

答案 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?");
    }
}