You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring事务结合try-catch:表A写入操作是否会成功?

问题解答

表A的写入会成功,原因如下:

Spring的@Transactional事务逻辑核心规则是:只有当事务方法抛出未被内部捕获、且符合回滚规则的异常时,才会触发事务回滚。如果异常被方法内部捕获处理且没有重新抛出,事务管理器会判定方法执行正常,最终提交整个事务。

看你给出的代码:

@Transactional
fun accept() {
    try {
        // 写入表A
        throw Exception()
    } catch(e: Exception) {
        // 写入表B
    }
}

已知表B的写入成功,说明最终事务处于提交状态:

  • 你在try块抛出的Exception被内部catch捕获,没有重新抛出,Spring事务管理器无法感知到异常的发生,因此会提交整个事务。
  • 这就导致try块里的表A写入操作,和catch块里的表B写入操作,都会被持久化到数据库。

唯一的例外情况:如果你的@Transactional注解配置了rollbackFor = Exception.class,那么抛出Exception时事务会被标记为回滚,即使你捕获异常并写入表B,最终整个事务还是会回滚(表B的写入也会失败)——但你明确说明表B写入成功,所以这种配置情况可以直接排除。

内容的提问来源于stack exchange,提问作者Zeeshan Shamsuddeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:57:22