我如何知道交易是否已经失败并被回滚?

时间:2018-06-15 14:00:34

标签: java spring spring-transactions acid

我目前正在使用spring @transactional注释来进行一系列数据库更改。在我没有抛出的任何异常(例如我的UPDATA子句违反表中的列约束)时,事务成功回滚。但是,控制台中不会打印任何错误消息。

我想手动处理这种情况。例如,我可能想要在txt文件中记录此类事件。我想知道是否有办法让我能够捕捉到这些异常(或者更确切地说,有一个监听这类事件的人)。

相关代码

@Transactional
public class DefaultFooService implements FooService {
    public Foo getFoo(String fooName) {
        INSERT A ROW
        UPDATE A ROW
    }
}

在上面的代码中,假设INSERT A ROW成功但UPDATE A ROW由于SQLException而失败(例如由于列限制违规)。目前,控制台中没有打印错误消息,并且日志记录设置为INFO。当我使用DEBUG时,我可以看到检测到SQLException并且tx被回滚。

如果交易失败并回滚,我如何得到通知?

==

这个问题与dynamically register transaction listener with spring?有些不同,因为我希望当且仅当我的交易失败并且我想知道它失败的原因时才会收到通知。

以不同方式说明问题。在以下代码块中,当前不会抛出任何异常(在stdout中打印)。我怎么能捕获/处理RuntimeException?

@Transactional
public class DefaultFooService implements FooService {
    public Foo getFoo(String fooName) {
        throw new RuntimeException();
    }
}

1 个答案:

答案 0 :(得分:-1)

您可以在数据库操作周围使用try-catch-blocks,并使用异常信息执行任何操作。 然后,如果您仍然想要回滚,则可以从catch块内部抛出异常。 或者,如果你真的想得到幻想:

@Transactional(rollbackFor={FancyOwnException.class})

甚至手动捕捉内部:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();