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

首次调用服务抛出Spring事务同步异常,二次调用正常求解决

问题解决建议

问题根源

你遇到的异常核心原因是MyBatis配置的事务工厂与Spring事务同步机制不兼容:

  • 当前使用的ManagedTransactionFactory是MyBatis原生的容器管理事务工厂,它不支持Spring的事务同步逻辑;
  • 首次调用时Spring事务上下文初始化过程中,MyBatis尝试注册会话到Spring事务同步时,因事务工厂不匹配抛出异常;第二次调用可能事务上下文已稳定,绕过了同步检查,但这只是临时现象,并非根本解决。

修复步骤

1. 替换事务工厂为SpringManagedTransactionFactory

将config.xml中的mybatisTransactionManager bean替换为MyBatis Spring提供的专用事务工厂:

<!-- 替换原ManagedTransactionFactory为SpringManagedTransactionFactory -->
<bean id="mybatisTransactionManager" class="org.mybatis.spring.transaction.SpringManagedTransactionFactory" />

这个工厂是专门为Spring事务同步设计的,能完美配合Spring的事务管理机制。

2. 确保Spring事务管理器配置完整

如果你的Spring上下文还未配置数据源事务管理器,需要添加以下配置(如果已存在可忽略):

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

这一步是让Spring能正确管理数据源的事务,与MyBatis的事务工厂形成配合。

3. 验证EJB事务注解与Spring事务的兼容性

你的EJB使用了@Transactional和@TransactionAttribute,需要确保容器(比如JBoss/WildFly)的EJB事务与Spring事务能正确协同。如果存在冲突,可以考虑改用Spring的@Transactional注解(需开启Spring事务注解支持):

<context:annotation-config />
<tx:annotation-driven transaction-manager="transactionManager" />

然后将EJB中的@Transactional替换为Spring的org.springframework.transaction.annotation.Transactional。

验证修复

修改配置后,重启服务,首次调用getUsersList方法应该不再抛出异常,且多次调用都能稳定获取数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:05:28