JavaJVM · Java虚拟机原理 · JVM上语言·框架· 生态系统RxJava

SpringBoot整合Seata

2021-10-06  本文已影响0人  迦叶_金色的人生_荣耀而又辉煌

上一篇 <<<Seata-核心源码分析
下一篇 >>>Seata与Lcn的区别


1.事务协调者(TC)启动

A、创建数据库,并执行sql: db_store.sql
B、修改 registry.conf和file.conf配置
Registry.conf支持:file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
file.conf:修改db信息
C、seata-server.sh启动脚本

2.发起方TM和参与方RM整合

在关联的数据库里执行db_undo_log.sql后在执行下面操作

2.1 引入jar包依赖

<dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-seata</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>

2.2 配置修改

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 10.211.55.16:8848
        #feign客户端的命名必须使用中划线,不能使用下划线
    refresh:
      enabled: false
      #seata配置
    alibaba:
      seata:
        tx-service-group: my_test_tx_group
  application:
    name: seata-user-service
  datasource:
    url: jdbc:mysql://localhost:3306/jarye?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

拷贝registry.conf和file.conf到配置文件地方
其中tx-service-group的配置要和file.conf里的vgroup_mapping名称一致

service { 
  vgroup_mapping.my_test_tx_group = "default" 
  default.grouplist = "127.0.0.1:8091"
}

2.3 剔除默认数据源

//自定义配置
@Configuration
public class DataSourceProxyConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return new DruidDataSource();
    }

    @Bean
    public DataSourceProxy dataSourceProxy(DataSource dataSource) {
        return new DataSourceProxy(dataSource);
    }

    @Bean
    public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSourceProxy);
        sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
        return sqlSessionFactoryBean.getObject();
    }
}
启动的地方剔除默认的数据源加载
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@MapperScan("com.jgspx.mapper")
public class SeataUserApp {
    public static void main(String[] args) {
        SpringApplication.run(SeataUserApp.class);
    }
}

2.4 注解使用

只要在发起方增加注解,参与方不用任何注解

@GlobalTransactional
@GetMapping("/orderToMember")
public String orderToMember(Long userId) {
    orderMapper.insertUser(userId+"");
    String result = userServiceFeign.getUser(userId);
    return "我是订单服务,调用会员服务接口返回结果:" + result;
}

2.5 通过日志来验证

当出现异常或超时,日志信息:
Branch Rollbacked result: PhaseTwo_Rollbacked
当执行成功,日志信息:
Branch commit result: PhaseTwo_Committed


推荐阅读:
<<<分布式事务产生的背景
<<<解决分布式事务的核心思路
<<<柔性事务和刚性事务(ACID)
<<<CAP理论简单概况
<<<Base理论核心思想
<<<一致性协议--XA接口
<<<一致性协议--Jta规范
<<<一致性协议--2PC提交协议
<<<一致性协议--3PC提交协议
<<<2PC与3PC协议的提交区别
<<<主流的分布式事务解决框架
<<<LCN-框架介绍
<<<LCN-实现原理剖析
<<<LCN-事务协调者(TM)安装启动
<<<SpringBoot整合LCN
<<<LCN-核心源码分析
<<<LCN-集群模式介绍
<<<Seata-框架介绍
<<<Seata原理实现/执行流程/生命周期
<<<Seata-TM执行时突然宕机了会造成什么问题
<<<Seata-核心源码分析
<<<Seata与Lcn的区别

上一篇下一篇

猜你喜欢

热点阅读