1.启动服务端
1.下载 seata-server-1.4.2
2.创建数据库
- DROP DATABASE IF EXISTS `ry-seata`;
-
- CREATE DATABASE `ry-seata` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-
- SET NAMES utf8mb4;
- SET FOREIGN_KEY_CHECKS = 0;
-
- USE `ry-seata`;
-
- -- -------------------------------- The script used when storeMode is 'db' --------------------------------
- -- the table to store GlobalSession data
- CREATE TABLE IF NOT EXISTS `global_table`
- (
- `xid` VARCHAR(128) NOT NULL,
- `transaction_id` BIGINT,
- `status` TINYINT NOT NULL,
- `application_id` VARCHAR(32),
- `transaction_service_group` VARCHAR(32),
- `transaction_name` VARCHAR(128),
- `timeout` INT,
- `begin_time` BIGINT,
- `application_data` VARCHAR(2000),
- `gmt_create` DATETIME,
- `gmt_modified` DATETIME,
- PRIMARY KEY (`xid`),
- KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
- KEY `idx_transaction_id` (`transaction_id`)
- ) ENGINE = InnoDB
- DEFAULT CHARSET = utf8mb4;
-
- -- the table to store BranchSession data
- CREATE TABLE IF NOT EXISTS `branch_table`
- (
- `branch_id` BIGINT NOT NULL,
- `xid` VARCHAR(128) NOT NULL,
- `transaction_id` BIGINT,
- `resource_group_id` VARCHAR(32),
- `resource_id` VARCHAR(256),
- `branch_type` VARCHAR(8),
- `status` TINYINT,
- `client_id` VARCHAR(64),
- `application_data` VARCHAR(2000),
- `gmt_create` DATETIME(6),
- `gmt_modified` DATETIME(6),
- PRIMARY KEY (`branch_id`),
- KEY `idx_xid` (`xid`)
- ) ENGINE = InnoDB
- DEFAULT CHARSET = utf8mb4;
-
- -- the table to store lock data
- CREATE TABLE IF NOT EXISTS `lock_table`
- (
- `row_key` VARCHAR(128) NOT NULL,
- `xid` VARCHAR(96),
- `transaction_id` BIGINT,
- `branch_id` BIGINT NOT NULL,
- `resource_id` VARCHAR(256),
- `table_name` VARCHAR(32),
- `pk` VARCHAR(36),
- `gmt_create` DATETIME,
- `gmt_modified` DATETIME,
- PRIMARY KEY (`row_key`),
- KEY `idx_branch_id` (`branch_id`)
- ) ENGINE = InnoDB
- DEFAULT CHARSET = utf8mb4;
3.填写配置
seata-server-1.4.2/conf/registry.conf
- registry {
- # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
- type = "nacos"
-
- nacos {
- application = "seata-server"
- serverAddr = "127.0.0.1:8848"
- group = "DEFAULT_GROUP"
- namespace = ""
- cluster = "DEFAULT"
- username = "nacos"
- password = "nacos"
- }
- eureka {
- serviceUrl = "http://localhost:8761/eureka"
- application = "default"
- weight = "1"
- }
- redis {
- serverAddr = "localhost:6379"
- db = 0
- password = ""
- cluster = "default"
- timeout = 0
- }
- zk {
- cluster = "default"
- serverAddr = "127.0.0.1:2181"
- sessionTimeout = 6000
- connectTimeout = 2000
- username = ""
- password = ""
- }
- consul {
- cluster = "default"
- serverAddr = "127.0.0.1:8500"
- aclToken = ""
- }
- etcd3 {
- cluster = "default"
- serverAddr = "http://localhost:2379"
- }
- sofa {
- serverAddr = "127.0.0.1:9603"
- application = "default"
- region = "DEFAULT_ZONE"
- datacenter = "DefaultDataCenter"
- cluster = "default"
- group = "SEATA_GROUP"
- addressWaitTime = "3000"
- }
- file {
- name = "file.conf"
- }
- }
-
- config {
- # file、nacos 、apollo、zk、consul、etcd3
- type = "nacos"
-
- nacos {
- serverAddr = "127.0.0.1:8848"
- namespace = ""
- group = "SEATA_GROUP"
- username = "nacos"
- password = "nacos"
- dataId = "seataServer.properties"
- }
- consul {
- serverAddr = "127.0.0.1:8500"
- aclToken = ""
- }
- apollo {
- appId = "seata-server"
- ## apolloConfigService will cover apolloMeta
- apolloMeta = "http://192.168.1.204:8801"
- apolloConfigService = "http://192.168.1.204:8080"
- namespace = "application"
- apolloAccesskeySecret = ""
- cluster = "seata"
- }
- zk {
- serverAddr = "127.0.0.1:2181"
- sessionTimeout = 6000
- connectTimeout = 2000
- username = ""
- password = ""
- nodePath = "/seata/seata.properties"
- }
- etcd3 {
- serverAddr = "http://localhost:2379"
- }
- file {
- name = "file.conf"
- }
- }
4.nacos中seata的配置文件seataServer.properties内容
- store.mode=db
- store.db.datasource=druid
- store.db.dbType=mysql
- store.db.driverClassName=com.mysql.jdbc.Driver
- store.db.url=jdbc:mysql://127.0.0.1:3306/ry-seata?rewriteBatchedStatements=true
- store.db.user=root
- store.db.password=123456
- store.db.minConn=5
- store.db.maxConn=30
- store.db.globalTable=global_table
- store.db.branchTable=branch_table
- store.db.queryLimit=100
- store.db.lockTable=lock_table
- store.db.maxWait=5000
5.运行服务端
seata-server.bat -h 192.168.1.5
启动成功
2.配置微服务项目
1.引入依赖
- <!-- SpringBoot Seata -->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
- <version>2.2.5.RELEASE</version>
- <exclusions>
- <exclusion>
- <groupId>io.seata</groupId>
- <artifactId>seata-spring-boot-starter</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
- <dependency>
- <groupId>io.seata</groupId>
- <artifactId>seata-spring-boot-starter</artifactId>
- <version>1.4.2</version>
- </dependency>
2.修改微服务的配置文件
- # seata配置
- seata:
- # 默认关闭,如需启用spring.datasource.dynami.seata需要同时开启
- enabled: true
- # Seata 应用编号,默认为 ${spring.application.name}
- application-id: seata-server
- # Seata 事务组编号,用于 TC 集群名
- tx-service-group: default_tx_group
- # 关闭自动代理
- enable-auto-data-source-proxy: false
- # 服务配置项
- service:
- # 虚拟组和分组的映射
- vgroup-mapping:
- #映射集群名称
- default_tx_group: DEFAULT
- registry:
- type: nacos
- nacos:
- application: seata-server
- server-addr: 127.0.0.1:8848
- namespace:
- username: nacos
- password: nacos
- group: DEFAULT_GROUP
- data-source-proxy-mode: XA
2.微服务链接的数据库需要建表
- -- for AT mode you must to init this sql for you business database. the seata server not need it.
- CREATE TABLE IF NOT EXISTS `undo_log`
- (
- `branch_id` BIGINT(20) NOT NULL COMMENT 'branch transaction id',
- `xid` VARCHAR(100) NOT NULL COMMENT 'global transaction id',
- `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
- `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
- `log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',
- `log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
- `log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
- UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
- ) ENGINE = InnoDB
- AUTO_INCREMENT = 1
- DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
3.启动微服务
链接成功
4.测试 @GlobalTransactional 注解
- /**
- * 删除物业公司
- */
- @RequiresPermissions("business:propertyCompany:remove")
- @Log(title = "物业公司", businessType = BusinessType.DELETE)
- @DeleteMapping("/{ids}")
- @GlobalTransactional
- public AjaxResult remove(@PathVariable Long[] ids)
- {
- //return toAjax(bPropertyCompanyService.deleteBPropertyCompanyByIds(ids));
- List<Long> longs = Arrays.asList(ids);
- for(Long id:longs){
- BPropertyCompany byId = bPropertyCompanyService.getById(id);
-
- ClosePropertyCompanyOrCommunityParam param=new ClosePropertyCompanyOrCommunityParam();
- param.setId(String.valueOf(byId.getId()));
- param.setType(0);
- param.setPhone(byId.getPhone());
- R<Map> rmap= remoteUserService.closePropertyCompanyOrCommunity(param, SecurityConstants.INNER);
- if (rmap.getCode() == 500){
- throw new RuntimeException(rmap.getMsg());
- }
- }
- boolean b = bPropertyCompanyService.removeByIds(Arrays.asList(ids));
- return toAjax(b);
- }
需要注意的是:这两处必须一致