分布式事务-Atomikos解决多数据源事务问题

目录

  • 场景
  • 多数据源配置
  • 引入Atomikos
  • 测试service

1. 场景:

经常会碰到这种应用场景,比如说下订单的操作,有需要修改订单库中信息,又需要修改产品库中库存,这一个操作就是需要一次性操作两个数据源的情况,这种情况的事务控制可以使用Atomikos框架进行实现

2. 多数据源配置

参考:http://www.chengqj.com/info.html?id=33

3. 引入Atomikos

  1. 引入jar包
  2. 修改DataSourceConfig

3.1 引入jar包

    implementation('org.springframework.boot:spring-boot-starter-jta-atomikos')

3.2 修改DataSourceConfig


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * @program: twodatasource
 * @description: 数据源
 * @author: chengqj
 * @create: 2018-10-24 11:39
 **/
@Configuration
public class DataSourceConfig {

    @Bean(name = "ds1")
    // application.properteis中对应属性的前缀
    @ConfigurationProperties(prefix = "first.datasource")
    public DataSource dataSource1(Environment env) {
        AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
        Properties prop = build(env, "first.datasource.");
        ds.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
        ds.setUniqueResourceName("ds1");
        ds.setXaProperties(prop);
        return ds;
    }

    @Bean(name = "ds2")
    // application.properteis中对应属性的前缀
    @ConfigurationProperties(prefix = "second.datasource")
    public DataSource dataSource2(Environment env) {
        AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
        Properties prop = build(env, "second.datasource.");
        ds.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
        ds.setUniqueResourceName("ds2");
        ds.setXaProperties(prop);
        return ds;
    }

    private Properties build(Environment env, String prefix) {

        Properties prop = new Properties();
        prop.put("URL", env.getProperty(prefix + "jdbc-url"));
        prop.put("user", env.getProperty(prefix + "username"));
        prop.put("password", env.getProperty(prefix + "password"));
        return prop;
    }
}

4. 测试service

import com.chengqj.twodatasource.dao.entity.TClass;
import com.chengqj.twodatasource.dao.entity.Teacher;
import com.chengqj.twodatasource.service.TClassServiceImpl;
import com.chengqj.twodatasource.service2.TeacherServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.LinkedHashMap;
import java.util.Map;

@Service
public class JtaTestServiceImpl{

    @Autowired
    private TeacherServiceImpl teacherService;
    @Autowired
    private TClassServiceImpl tclassService;

    @Transactional( propagation = Propagation.REQUIRED, rollbackFor = { RuntimeException.class })
    public Map<String, Object> test01() {
        LinkedHashMap<String,Object> resultMap=new LinkedHashMap<String,Object>();
        TClass tClass=new TClass();
        tClass.setId("23");
        tClass.setName("8888");
        tclassService.save(tClass);

        Teacher teacher=new Teacher();
        teacher.setId("23");
        teacher.setName("8888");
        teacherService.save(teacher);
        System.out.println(1/0);
        resultMap.put("state","success");
        resultMap.put("message","分布式事务问题");
        return resultMap;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值