spring事务 Transaction rolled back because it has been marked as rollback-only

今天调试的时候出现了错误:错误信息: Transaction rolled back because it has been marked as rollback-only ,经过排查后发现因为事务被提交了两次。如果以后出现了这样的错误,应该先看看自己的代码和相关的spring配置,看是否aop中已经配置了事务,但是又在代码中写了事务,这个最有可能导致这样的错误。

### 解决方案:Transaction Rolled Back Because It Has Been Marked As Rollback-Only 当遇到 `transaction rolled back because it has been marked as rollback-only` 错误时,通常意味着当前事务已经被标记为只回滚状态。这种情况可能发生在多种场景下,特别是在分布式事务管理环境中,如Java EE中的JTA或EJB应用。 #### 1. 理解原因 此错误的根本原因是某个操作已经触发了事务的回滚机制,使得整个事务无法再继续提交。这可能是由于显式的调用了 `setRollbackOnly()` 方法,或者是某些未被捕获的异常导致[^1]。 #### 2. 检查并调整配置 对于基于Spring的应用程序来说,确保正确设置了 `@Transactional` 注解的相关参数非常重要。特别是要关注 `propagation` 和 `isolation` 属性以及 `rollbackFor` 参数: - **Propagation Behavior**: 设置合适的传播行为可以有效避免不必要的嵌套事务问题。 - **Isolation Level**: 调整隔离级别有助于减少并发冲突的可能性。 - **Exception Handling with `rollbackFor`**: 明确指定哪些类型的异常应该触发事务回滚是非常重要的。默认情况下,只有运行时异常才会引起回滚;因此,如果业务逻辑中有特定的受检异常也需要回滚,则需特别指明这些异常类型[^3]。 ```java @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = {CustomCheckedException.class}) public void performOperation() { // Business logic here... } ``` #### 3. 处理嵌套事务 在涉及多个服务层方法的情况下,注意区分不同层次之间的事务边界。虽然大多数时候推荐使用声明式事务管理方式(即通过注解),但在复杂场景中适当采用编程式事务控制也可能有所帮助。此外,在JTA环境下要注意同步机制的影响[^2]。 #### 4. 日志记录与调试 启用详细的日志输出可以帮助定位具体哪个部分的操作引发了事务的状态变化。查看应用程序的日志文件,寻找任何有关事务管理和异常处理的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值