SpringBoot+SpringCloud集成分布式事务seata

分布式事务seata入门Demo

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

本文采用的seata-server-1.4.0.zip

2. 官方文档:http://seata.io/en-us/docs/ops/deploy-server.html

下载下来直接解压,因为使用nacos做注册中心的参考文档很多,所以本文使用eureka,配置简单。

1. 首先修改conf文件夹下的注册中心registry.conf文件

SpringBoot+SpringCloud集成分布式事务seata_第1张图片

2. 修改配置中心file.conf文件

SpringBoot+SpringCloud集成分布式事务seata_第2张图片
复制进去就OK。

service {
  #transaction service group mapping
  ## 指定group名
  vgroup_mapping.my_test_tx_group = "seata-server"  #可自行定义组名
  #only support when registry.type=file, please don't set multiple addresses
  default.grouplist = "127.0.0.1:8091" #默认端口
  #disable seata
  disableGlobalTransaction = false
}

后文会提到这里:
SpringBoot+SpringCloud集成分布式事务seata_第3张图片

3. 创建上文提到的的三张表
CREATE TABLE `global_table` (
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `status` tinyint NOT NULL,
  `application_id` varchar(32) DEFAULT NULL,
  `transaction_service_group` varchar(32) DEFAULT NULL,
  `transaction_name` varchar(128) DEFAULT NULL,
  `timeout` int DEFAULT NULL,
  `begin_time` bigint DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`xid`),
  KEY `idx_gmt_modified_status` (`gmt_modified`,`status`),
  KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `branch_table` (
  `branch_id` bigint NOT NULL,
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `resource_group_id` varchar(32) DEFAULT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `branch_type` varchar(8) DEFAULT NULL,
  `status` tinyint DEFAULT NULL,
  `client_id` varchar(64) DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime(6) DEFAULT NULL,
  `gmt_modified` datetime(6) DEFAULT NULL,
  PRIMARY KEY (`branch_id`),
  KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `lock_table` (
  `row_key` varchar(128) NOT NULL,
  `xid` varchar(96) DEFAULT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `branch_id` bigint NOT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `table_name` varchar(32) DEFAULT NULL,
  `pk` varchar(36) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`row_key`),
  KEY `idx_branch_id` (`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
将undo_log表创建到自己的库中
CREATE TABLE `undo_log` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `branch_id` bigint NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int 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=5 DEFAULT CHARSET=utf8;

SpringBoot+SpringCloud集成分布式事务seata_第4张图片

4. 先启动Euerka服务,然后在seata的bin目录下进入cmd启动seata-server.bat

如果启动seata报错缺少文件,看另一篇博文https://blog.csdn.net/weixin_52200307/article/details/111387204
SpringBoot+SpringCloud集成分布式事务seata_第5张图片

解决上面问题再次启动seata服务,启动成功。
SpringBoot+SpringCloud集成分布式事务seata_第6张图片
然后打开Eureka查看seata有没有注册进去。
SpringBoot+SpringCloud集成分布式事务seata_第7张图片

5. 到这一步seata服务端大致完成,下面是客户端配置

首先都要引入seata的依赖


        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-alibaba-seataartifactId>
            <version>2.2.0.RELEASEversion>
            <exclusions>
                <exclusion>
                    <groupId>io.seatagroupId>
                    <artifactId>seata-spring-boot-starterartifactId>
                exclusion>
            exclusions>
        dependency>
        <dependency>
            <groupId>io.seatagroupId>
            <artifactId>seata-spring-boot-starterartifactId>
            <version>1.3.0version>
        dependency>

其次每个模块都需要seata的配置
SpringBoot+SpringCloud集成分布式事务seata_第8张图片

#seata配置
seata:
  enabled: true
  application-id: order-server #服务名
  tx-service-group: my_test_tx_group # 自定义的事务分组名称
  enable-auto-data-source-proxy: true # 启用自动数据源代理
  use-jdk-proxy: false
  service:
    vgroup-mapping:
      my_test_tx_group: seata-eureka # seata-eureka是tc注册到注册中心的服务名称
    enable-degrade: false # 是否启用降级
    disable-global-transaction: false # 是否禁用全局事务
  config:
    type: file # 配置中心为file模式
  registry:
    type: eureka # 注册中心为eureka
    eureka:
      weight: 1
      service-url: http://localhost:10001/eureka # 注册中心地址
6. 启动自己项目,查看是否有seata服务可用

这是我自己遇到的问题,虽然上文也强调了这个问题,但还是会有码农犯跟我一样的错误,启动未报错的则跳过。


启动成功
SpringBoot+SpringCloud集成分布式事务seata_第9张图片
SpringBoot+SpringCloud集成分布式事务seata_第10张图片

7. 在服务调用方的方法上加上@GlobalTransactional注解实现分布式事务

8. seata-demo代码仓库地址:https://gitee.com/tan-Afei/seata-demo.git

你可能感兴趣的:(java,分布式事务,seata,java,分布式)