Spring+Hibernate+Oracle存储过程内COMMIT引发事务回滚异常问询
Spring+Hibernate+Oracle事务异常:存储过程内COMMIT导致部分数据无法回滚
问题场景
- 基于Spring+Hibernate(ORM)+Oracle的项目,事务管理正常,但出现以下异常场景:
- 标注
@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
相关产品推荐
相关产品推荐

