我无法在注释@Transactional

时间:2017-12-04 15:59:09

标签: spring transactions rollback

我无法在带注释的@Transactional方法中捕获异常。 如果save操作成功,我想向已创建的用户发送邮件。

当用户名已被使用时,PostgreSQL会抛出异常PSQLException,这是SQLExcpetion的扩展,即Exception的扩展。我无法抓住ExceptionPSQLException然后我试图抓住Throwable这是有效的,但是没有解决我的问题并且抓住了Throwable新问题的原因。

  1. 当我得到DataIntegrityViolationException(这是Spring的一个excpetion)时,我想传播它,因为我有我的控制器的处理程序,它返回为这个具体异常指定的语句和状态。当我抓住Throwable时,我必须抛出RuntimeException。

  2. 非常奇怪的是,即使抛出了一些异常,也会调用emailSender.sendEmail()。但是如果userRepository抛出异常,则不应该调用任何方法,并且应该在catch语句中捕获异常,然后事务应该回滚。我是否正确理解交易?

  3. 我的服务实施:

    @Transactional
    public UserEntity createUser(UserEntity user) {
        try {
            final UserEntity saved = userRepository.save(user);
            emailSender.sendEmail(saved);
            return saved;
        } catch (Throwable t) {
            throw new RuntimeException();
        }
        return null;
    }
    

    当我尝试使用IDEA调试此方法时,调试器不会输入catch语句,但我的处理程序注释@RestControllerAdvice正在捕获此异常。

    知道什么是错的,或者你知道类似的问题吗?

1 个答案:

答案 0 :(得分:2)

遇到同样的问题。使用 saveAndFlush 修复。

这是有道理的,因为对于事务性,事务在执行函数后被提交(到数据库)。但对于 saveAndFlush,情况并非如此。