spring多数据源分布式事务一致性的问题
在多数据源的情况下,建议不要使用事务,尽量保证一个事务下只操作一个数据库,
保持服务的功能单一性,如果一个服务会操作到两个数据库中的数据,那涉及到的所有表最好放到同一个数据库中。
因为分布式事务管理,消耗资源严重,性能下降(取消如下事务配置)。
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

具体原因,在使用事务的方法内,只会产生一个数据库链接,既第一次进入时选择的数据库链接,之后方法内使用的其它数据源不会切换而是继续使用这个数据库链接。



如果不是分布式事务管理,又有多个数据源,
我们就要配置多个事务管理器了,哈哈,每个数据源配置一个。
这样我们 再服务上配置使用的事务的时候,就要配置指定的事务管理器了。

此外如果我们用到了 mybatis 或者hibernate 框架的话,
sessionfactory  也是需要配置多个的。


现在我们有两个服务a和b,分别操作一个数据库,如果a 中 又调用b服务,
这时候实际上 a服务  是操作了多个数据源的,
如果要保证事务一致性,就需要 判断 b服务的返回结果,

如果b服务中,出错了会抛异常,那我们就try catch b 服务,并且  重新在a 中 把这个异常抛出。
如果b服务中,始终返回结果,并且结果的状态是错误的,我们就不能 trycatch了,而是判断返回结果的状态,
如果是错误的就在a 中抛出异常。

如果是分布式事务管理,意味着项目里有服务 需要操作多个数据库,并且要做到事务一致性。
spring的org.springframework.transaction.jta.JtaTransactionManager,提供了分布式事务支持。如果使用WAS的JTA支持,把它的属性改为WebSphere对应的TransactionManager。 
    在tomcat下,是没有分布式事务的,不过可以借助于第三方软件jotm(Java Open Transaction Manager )和AtomikosTransactionsEssentials实现,在spring中分布式事务是通过jta(jotm,atomikos)来进行实现。 
1、http://jotm.objectweb.org/ 
2、http://www.atomikos.com/Main/TransactionsEssentials 

评论 (0)