首页 > 解决方案 > 我如何知道事务是否失败并被回滚?

问题描述

我目前正在使用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 被回滚。

当事务失败并回滚时如何通知我?

======

这个问题和用spring动态注册事务监听器有些不同?因为当且仅当我的交易失败并且我想知道它为什么失败时,我才想收到通知。


以不同的方式说明问题。在下面的代码块中,当前不会抛出异常(打印在标准输出中)。我如何捕捉/处理 RuntimeException?

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

标签: javaspringspring-transactionsacid

解决方案


您可以在数据库操作周围使用 try-catch-blocks 并对异常信息做任何您想做的事情。然后,如果您决定仍要回滚,则可以从 catch 块内抛出异常。或者,如果您真的想变得花哨:

@Transactional(rollbackFor={FancyOwnException.class})

甚至在手动捕获内:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

推荐阅读