Steata分布式事务的使用

Steata分布式事务的使用场景是并发量不是很大的后台管理系统。
steate介绍和使用官网:http://seata.io/zh-cn/docs/overview/what-is-seata.html
我们这里使用的分布式事务解决方案是AT模式也即是2pc模式
我们所使用的是0.7.1版本,不同版本可能使用的方式有点区别。

  • seata 要控制分布式事务

  • 1)、每一个微服务的数据库必须创建uodo_log表
    – 注意此处0.7.1+ 增加字段 context
    CREATE TABLE undo_log (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    branch_id bigint(20) NOT NULL,
    xid varchar(100) NOT NULL,
    context varchar(128) NOT NULL,
    rollback_info longblob NOT NULL,
    log_status int(11) NOT NULL,
    log_created datetime NOT NULL,
    log_modified datetime NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY ux_undo_log (xid,branch_id)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    在这里插入图片描述

  • 2)、安装事务协调器 seata-server https://github.com/seata.seata/releases
    在这里插入图片描述
    registry.conf 注册中心配置 修改registry type=nacos,地址改为nacos的连接地址。
    在这里插入图片描述
    然后启动服务

  • 3)、整合
    1、导入依赖 spring-cloud-starter-alibaba-seata | seata-all-0.7.1

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
  • 3、所有想要用到分布式事务的微服务使用seata DataSourceProxy
@Configuration
public class MySeataConfig {
    
    

    @Autowired
    DataSourceProperties dataSourceProperties;

    @Bean
    public DataSource dataSource(DataSourceProperties dataSourceProperties) {
    
    
        HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
        if (StringUtils.hasText(dataSourceProperties.getName())) {
    
    
            dataSource.setPoolName(dataSourceProperties.getName());
        }
        return new DataSourceProxy(dataSource);
    }
}

  • 4、每个服务都导入
    registry.conf, file.conf
    在这里插入图片描述
    file.conf 的 service.vgroup_mapping 配置必须和spring.application.name一致
    设置:vgroup_mapping.gulimall-order-fescar-service-group = “default”,也可以通过配置 spring.cloud.alibaba.seata.tx-service-group修改后缀,但是必须和file.conf中的配置保持一致
    在这里插入图片描述
  • 5、大事务:@GlobalTransactional
  • 6、远程小事务:@Transactional
    入口处就使用@GlobalTransactional,而其他的远程调用开启事务的是就使用本地事务@Transactional即可
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u014496893/article/details/114238773
今日推荐