spring多数据源分布式事务管理

一、背景

项目中使用到了两个数据源,且在同一个方法里用到了这两个数据源,并且需要保证事务一致性。

二、解决方案

解决该问题需要使用分布式事务处理,常见的实现JTA事务管理的第三方管理工具 ,一个是JOTM,一个是Atomikos。JOTM于2009年3月份后已不再更新,而且spring3以后不在支持jotm。

系统框架基于Spring5+Mybatis3+mysql,所以这里使用atomikos+jta的方案来处理该问题。

JTA(ava Transaction API): JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。
Atomikos(Atomikos TransactionsEssentials): 是一个为Java平台提供的开源事务管理器,全名Atomikos TransactionsEssentials.
JOTM(Java Open Transaction Manager): 是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分,为其提供JTA分布式事务的功能。

三、代码实现

代码结构

spring多数据源分布式事务管理_第1张图片

Dependency



	com.atomikos
	transactions-jdbc
	3.9.3

        


	javax.transaction
	jta
	1.1

配置文件

这里为了演示不同的数据源实现方案,同时使用了两种类型的数据源,读者可根据项目情况使用。
datasourcea.xml: 数据源1采用DruidXADataSource


    
        
        
            
                jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf-8
            
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

    
    
        
        
        
        
        
        
        
        
        
    

    
    
        
        
            
                classpath*:com/study/mappera/**/*.xml
            
        
    

    
        
        
    

datasourceb.xml: 数据源2使用MysqlXADataSource

 
    
        
        
        
        
        
            
                
                    jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf-8
                
                root
                root
            
        
        
        
        
        
        
        
    

    
        
        
            
                classpath*:com/study/mapperb/**/*.xml
            
        
    

    
        
        
    

spring-context.xml

    
    

    
   

    
   


    
    
        
    

    
    
        
    

    
    
        
        
        
        
    

    
    

    
    
        
            
            
            
            
            
        
    

    
        
        
    

代码

ServeiceTest.java测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-context.xml"})
public class ServiceTest {

    @Autowired
    private DTService dtService;

    /**
     * 单个数据源事务提交
     */
    @Test
    public void test_01() {
        dtService.saveDataSource1_A();
    }

    /**
     * 多个数据源提交 事务成功
     */
    @Test
    public void test_02() {
        dtService.saveTwoDataSourceSuccess();
    }

    /**
     * 多个数据源提交 事务回滚
     */
    @Test
    public void test_03() {
        dtService.saveTwoDataSourceFail();
    }
}

完整代码:https://github.com/zqhao/spring-mybatis-atomikos


------------本文结束感谢您的阅读------------

你可能感兴趣的:(spring)