Spring多数据源事务异常:第二数据库写操作报错
多数据源事务问题:第二个数据库无法执行更新/保存操作
问题分析
核心问题在于第二个数据库的写操作(保存/更新)因缺失事务上下文抛出异常,且尝试指定事务管理器时因注解使用错误导致类型转换失败:
- Spring默认的
@Transactional注解会自动匹配名为transactionManager的事务管理器,这是第一个数据库能正常执行所有操作的原因; - 若你导入的是
javax.transaction.Transactional(JTA注解)而非Spring官方事务注解,使用@Transactional(value="mdmTxnMang")时就会触发“字符串无法转换为txType”错误——因为JTA注解的value属性并非用于指定事务管理器名称。
解决方案
1. 切换到正确的事务注解
在DAO类中导入Spring官方的事务注解,替换JTA注解:
import org.springframework.transaction.annotation.Transactional;
2. 明确指定第二个数据库的事务管理器
使用Spring的@Transactional注解,通过transactionManager属性指定第二个库的事务管理器Bean名称:
@Transactional(transactionManager = "mdmTxnMang") public void saveClientBiller(client_biller client_biller) { try { this.mdmTmp.saveOrUpdate(client_biller); } catch (Exception e) { System.out.println("Exception- " + e); } }
也可简化为直接传入事务管理器名称(与transactionManager属性等效):
@Transactional("mdmTxnMang")
3. 额外验证项
- 开启事务注解驱动:确保Spring配置文件(如
jpaContext.xml)中添加事务注解支持:
如需指定默认事务管理器,可设置:<tx:annotation-driven /><tx:annotation-driven default-transaction-manager="transactionManager" /> - 数据库权限检查:确认第二个数据库账号拥有
INSERT、UPDATE、DELETE等写操作权限; - 事务上下文绑定:即使
HibernateTemplate设置了checkWriteOperations=false,写操作仍需处于有效事务上下文中,必须确保事务管理器正确绑定到对应数据源。
内容的提问来源于stack exchange,提问作者Akhilesh Dhiman
相关产品推荐
相关产品推荐

