5
回答
发现一个奇怪的问题, 这是springmvc多数据源问题
华为云4核8G,高性能云服务器,免费试用   

基本情况是这样的:在同一个ip下2个数据库; 典型的springmvc框架;

Controller层 调用一个xxxService.addMethod >> 方法里2个service: userService , shopService;

userService 操作的是 用户库> 新增用户后,返回最新用户id

shopSercie 操作是另一个库(简称店铺管理吧) ; 根据新增返回的的用户id, 创建店铺;

 

数据库切换用spring托管; 

user包下,会自动切换至用户库,操作完成后,释放链接,改回默认库; 

 

然后尴尬的问题的出现了;

xxxService.addMethod 中: userSerive确实成功切换数据库,且操作数据库(此时事务未提交,数据库并未更新) 返回最新userId,  shopService紧跟操作,拿着最新id操作 店铺数据库(不用切换,默认该库), 可以; 但AddMethod执行完毕,提示: 店铺数据库.user插入失败;

店铺数据库下是无user表的;

初步怀疑,xxxService.AddMethod完毕后,事务提交,但此时,持有的链接是默认库链接,导致插入失败; 这是事务的问题; 如果不用事务,那么我该这么保持它们的一致性呢;

 

 

 

 

 

 

 

举报
尾生
发帖于1年前 5回/327阅
共有5个答案 最后回答: 1年前

这个问题没遇到过,不过创建用户和其他操作应该是一个分开的过程,一般不建议一起执行,以免操作臃肿时间过长影响客户体验。可以通过消息队列进行处理,这样也方便以后添加积分模块等等功能进行追加操作

--- 共有 1 条评论 ---
尾生恩,这个实现逻辑也可以,不过我看了下有JTA事务管理也可以实现,谢谢回答; 1年前 回复

你确保Spring数据源切换没有配置错的话(比如,是否配置数据源切换在事务代理之前),可以用JTA实现多数据源的事务一致

引用来自“MnameHZJ”的评论

你确保Spring数据源切换没有配置错的话(比如,是否配置数据源切换在事务代理之前),可以用JTA实现多数据源的事务一致

我这边实现的话,一般都是配置两个数据源,然后设置给两个数据库操作对象。实际使用时,就不同的数据库用不同的对象操作,JTA保持事务统一。

引用来自“MnameHZJ”的评论

你确保Spring数据源切换没有配置错的话(比如,是否配置数据源切换在事务代理之前),可以用JTA实现多数据源的事务一致

谢谢,涨知识了; 我百度查了下,以前一直用的是单JDBC实现事务;确实可以通过JTA来实现

具体看文章内容:  http://www.cnblogs.com/drizzlewithwind/p/5711653.html 

简单的说 jta是多库的事务 jdbc是单库的事务

 

顶部