首次调用服务抛出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
相关产品推荐
相关产品推荐

