java - 我如何知道事务是否失败并被回滚?
问题描述
我目前正在使用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();
}
}
解决方案
您可以在数据库操作周围使用 try-catch-blocks 并对异常信息做任何您想做的事情。然后,如果您决定仍要回滚,则可以从 catch 块内抛出异常。或者,如果您真的想变得花哨:
@Transactional(rollbackFor={FancyOwnException.class})
甚至在手动捕获内:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
推荐阅读
- jquery - 在 Angular 中使用 jQuery 来处理事件或所有其他东西是一种好方法或最佳实践吗?
- foreach - ForEach 循环(Xcode 11 b6)中的“没有更多上下文的表达模棱两可”
- python-3.x - 如果整个数据帧中出现特定值/字符串,我想对其索引值求和
- excel - 使用 xlswriter 编写 Pandas 数据框时如何在 Excel 中设置格式
- mysql - 通过 MySQL 中的内部联接使用更新语句查找和替换
- sql - 在一个查询中选择带有 JOIN 和条件且不带 JOIN
- django-models - 给出日期时,应显示日期中的所有文件
- javascript - 本机 JavaScript 另一个 HTML 元素值在无线电触发事件更改时未更改
- scala - 如何在给定两列和计数的 SPARK scala 中创建邻接矩阵
- python - 在一个循环中打印多个单独的直方图