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

Spring+Hibernate+Oracle存储过程内COMMIT引发事务回滚异常问询

Spring+Hibernate+Oracle事务异常:存储过程内COMMIT导致部分数据无法回滚

问题场景

  • 基于Spring+Hibernate(ORM)+Oracle的项目,事务管理正常,但出现以下异常场景:
    1. 标注@Transactional的服务方法执行流程:
      • 调用oJpaRepositoryX.save(oEntity01HibernateObject)插入Entity01实体
      • 调用oJpaRepositoryZ.callDbStoredProcedure()执行存储过程,存储过程逻辑:
        • 插入一条Entity02数据
        • 执行COMMIT;语句
        • 再插入一条Entity02数据
      • 后续Java代码执行抛出异常

现象差异

  • 预期结果:事务回滚后,Entity01及所有Entity02数据均不存在
  • 实际结果:
    • Entity02的第一条数据留存于数据库
    • 回滚仅对Entity01和Entity02的第二条数据生效

测试验证

  • 注释存储过程内的COMMIT语句后,所有数据可正常全量回滚,证明存储过程与Java服务处于同一事务上下文
  • 无异常抛出时,所有数据均可正常提交

补充测试结论

存储过程内的COMMIT/ROLLBACK操作独立于Java TransactionManager,仅影响通过@Query(nativeQuery=true)执行的操作(这类操作会直接发送SQL到数据库执行);而常规JPA操作(如CrudRepository.save())会延迟到@Transactional方法结束时才提交到数据库,不受存储过程内部COMMIT的影响。

测试1

使用非native的@Query插入Entity01,结果与原场景一致:Entity02第一条数据留存,其余数据被回滚。

测试2

使用nativeQuery=true的@Query插入Entity01,结果为:Entity01和Entity02第一条数据留存,Entity02第二条数据被回滚。


内容的提问来源于stack exchange,提问作者floss.dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:10:31