You need to enable JavaScript to run this app. Spring事务管理与Hibernate整合后事务不生效无法回滚如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Spring事务管理与Hibernate整合后事务不生效无法回滚如何解决?

问题根因
  • 核心错误出在Repository层手动管理了独立的事务生命周期,完全脱离了服务层声明式事务的管控范围:
    你在ProductAlterRepositoryImpl.updateProduct方法中调用sessionFactory.openSession()打开了全新的独立Session,又手动调用session.getTransaction().begin()开启独立事务,且执行完操作后主动调用了commit()提交。两次Repository调用的事务在服务层抛出异常前就已经分别提交完成,外层事务自然无法回滚已经提交的操作。
  • 你对事务传播的理解存在偏差:Spring声明式事务默认传播级别为REQUIRED,正常配置下服务层开启的事务会贯穿整个调用链,Repository层应复用外层已有的事务和Session,不需要自行创建Session、管理事务边界。
  • 日志中的NoJtaPlatform输出属于正常提示,你当前使用单数据源本地事务,不需要JTA全局事务实现,该日志不影响事务功能。
修复方案
  1. 调整Repository层实现,改为获取绑定到当前事务的Session,移除所有手动事务管理逻辑,示例修复代码如下:
@Repository
class ProductAlterRepositoryImpl implements ProductAlterRepository {

    private SessionFactory sessionFactory;

    public ProductAlterRepositoryImpl(@Autowired SessionFactory sessionFactory) {
       this.sessionFactory = sessionFactory;
    }

    @Override
    public Optional<Product> updateProduct(Product product) {
        // 获取和当前事务绑定的Session,由Spring统一管理事务和Session生命周期
        Session session = sessionFactory.getCurrentSession();
        session.merge(product);
        return Optional.of(product);
    }
}

cartRepository的updateCart方法也需要做同样的修改,移除手动开Session、开事务、提交的逻辑。
2. 确认Hibernate配置中添加了Spring事务上下文绑定的配置,在hibernateProperties()方法中补充如下配置:

hibernateProperties.put("hibernate.current_session_context_class", "org.springframework.orm.hibernate5.SpringSessionContext");
hibernateProperties.put("hibernate.transaction.coordinator_class", "jdbc");
  1. 确认服务类添加了@Service注解被Spring容器托管,且没有出现@Transactional注解加在非public方法、同类内部方法自调用等事务失效场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 18:57:06