seata的启动与使用

1 下载seata

下载地址:https://github.com/seata/seata/releases/v0.9.0/

1.1 修改配置文件

将下载得到的压缩包进行解压,进入conf目录,调整下面的配置文件:

  • registry.conf
registry {
 type = "nacos"
 nacos {
   serverAddr = "localhost"
   namespace = "public"
   cluster = "default"
 }
}
config {
 type = "nacos"
 nacos {
   serverAddr = "localhost"
   namespace = "public"
   cluster = "default"
 }
}
  •  nacos-config.txt

service.vgroup_mapping.service-product=default
service.vgroup_mapping.service-order=default 

这里的语法为: service.vgroup_mapping.${your-service-gruop}=default ,中间的
${your-service-gruop} 为自己定义的服务组名称, 这里需要我们在程序的配置文件中配置。

1.3 初始化seata在nacos的配置

# 初始化seata 的nacos配置
# 注意: 这里要保证nacos是已经正常运行的
cd conf
nacos-config.sh 127.0.0.1

执行成功后可以打开Nacos的控制台,在配置列表中,可以看到初始化了很多Group为SEATA_GROUP的配置。

1.4 启动seata服务

cd bin
seata-server.bat -p 9000 -m file

启动后在 Nacos 的服务列表下面可以看到一个名为 serverAddr 的服务。

2 使用Seata实现事务控制

2.1 初始化数据表

在我们的数据库中加入一张undo_log表,这是Seata记录事务日志要用到的表

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,
`ext`      VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = INNODB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8;

2.2 添加配置

在需要进行分布式控制的微服务中进行下面几项配置:
添加依赖


  com.alibaba.cloud
  spring-cloud-starter-alibaba-seata


  com.alibaba.cloud
  spring-cloud-starter-alibaba-nacos-config

 DataSourceProxyConfig
Seata 是通过代理数据源实现事务分支的,所以需要配置 io.seata.rm.datasource.DataSourceProxy 的
Bean,且是 @Primary默认的数据源,否则事务不会回滚,无法实现分布式事务

 

@Configuration
public class DataSourceProxyConfig {
  @Bean
  @ConfigurationProperties(prefix = "spring.datasource")
  public DruidDataSource druidDataSource() {
    return new DruidDataSource();
 }
  @Primary
  @Bean
  public DataSourceProxy dataSource(DruidDataSource druidDataSource) {
    return new DataSourceProxy(druidDataSource);
 }
}

registry.conf

在resources下添加Seata的配置文件 registry.conf

registry {
 type = "nacos"
 nacos {
   serverAddr = "localhost"
   namespace = "public"
   cluster = "default"
 }
}
config {
 type = "nacos"
 nacos {
   serverAddr = "localhost"
   namespace = "public"
   cluster = "default"
 }
}

bootstrap.yaml

spring:
application:
 name: service-product
cloud:
 nacos:
  config:
   server-addr: localhost:8848 # nacos的服务端地址
   namespace: public
   group: SEATA_GROUP
 alibaba:
  seata:
   tx-service-group: ${spring.application.name}

2.3 在order微服务开启全局事务

@GlobalTransactional//全局事务控制
public Order createOrder(Integer pid) {}

2.4 测试

再次下单测试

3 seata运行流程分析

seata的启动与使用_第1张图片

要点说明:
1、每个RM使用DataSourceProxy连接数据库,其目的是使用ConnectionProxy,使用数据源和数据连接代理的目的就是在第一阶段将undo_log和业务数据放在一个本地事务提交,这样就保存了只要有业务操作就一定有undo_log。
2、在第一阶段undo_log中存放了数据修改前和修改后的值,为事务回滚作好准备,所以第一阶段完成就已经将分支事务提交,也就释放了锁资源。
3、TM开启全局事务开始,将XID全局事务id放在事务上下文中,通过feign调用也将XID传入下游分支事务,每个分支事务将自己的Branch ID分支事务ID与XID关联。
4、第二阶段全局事务提交,TC会通知各各分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各各参与者只需要删除undo_log即可,并且可以异步执行,第二阶段很快可以完成。
5、第二阶段全局事务回滚,TC会通知各各分支参与者回滚分支事务,通过 XID 和 Branch ID 找到相应的回滚日志,通过回滚日志生成反向的 SQL 并执行,以完成分支事务回滚到之前的状态,如果回滚失败则会重试回滚操作。

你可能感兴趣的:(oracle,数据库)