Spring捕获异常出错。Transaction marked as rollbackOnly

本文分析了一个关于Java事务管理的问题,当内部事务方法抛出异常并被捕获时,整个事务被标记为仅回滚,导致外部事务提交失败。文章提出了两种解决方案:移除外层事务或使用REQUIRES_NEW。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、错误发生。

项目中有下面这段代码:箭头表示的2个方法都有事务,外面的事务捕获了里面的事务。

143226_HUrM_2601303.png

当内层的事务方法异常时,运行后会报错:Could not commit JPA transaction RollbackException: Transaction marked as rollbackOnly

143403_8yfV_2601303.png

二、错误原因:

在一个transactional中如果有另一transaction,内层的事务会跟随外层的事务,变为一个整体的事务。

如果内层transaction发生了异常,即使你捕捉了这个异常,那么整体的Transaction也会被定义成RollbackOnly,这也正是事务管理的原则。所以当外层事务想提交整个事务时,出现异常。

二、解决方式:

把外面的transactional去掉。或者内层事务部跟随外层事务,内层事务定义为 requires_new,内层新启一个事务。

@Transactional(Transactional.TxType.REQUIRES_NEW)

转载于:https://my.oschina.net/kunBlog/blog/1505252

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值