文章目录
- nacos安装
- Mysql5.7安装及表初始化
- seata server安装
- 下载并解压seata安装包
- 在conf文件夹修改file.conf文件
- 向本地数据库导入seata需要的表
- 修改registry.conf文件
- 将seata配置信息添加到nacos配置中心
- 启动seata server
- springcloud整合seata
- 测试流程
- 正常下单流程
- 扣减库存失败流程
nacos安装
使用docker-compose安装,启动docker-compose up -d
docker-compose.yaml
文件如下:
version: "3.3"
services:nacos:image: docker-0.unsee.tech/nacos/nacos-server:latestcontainer_name: nacos-standaloneenvironment:- PREFER_HOST_MODE=hostname- MODE=standalonevolumes:- ./init.d/custom.properties:/home/nacos/init.d/custom.propertiesports:- 8848:8848
custom.properties
文件如下:
management.endpoints.web.exposure.include=*
Mysql5.7安装及表初始化
使用docker-compose安装,启动docker-compose up -d
docker-compose.yaml
文件如下:
version: '3.3'services:mysql:image: mysql:5.7 # 使用 MySQL 5.7 镜像container_name: mysql # 容器名称ports:- "3306:3306" # 将容器的 3306 端口映射到主机的 3306 端口environment:MYSQL_ROOT_PASSWORD: root # 设置 root 用户的密码MYSQL_DATABASE: mydb # 创建一个默认数据库MYSQL_USER: mysql # 创建一个新用户MYSQL_PASSWORD: mysql # 设置新用户的密码volumes:- mysql_data:/var/lib/mysql # 持久化 MySQL 数据networks:- mysql_networkvolumes:mysql_data: # 定义数据卷,用于持久化 MySQL 数据networks:mysql_network: # 定义网络
seata server安装
下载并解压seata安装包
https://github.com/apache/incubator-seata/releases/download/v1.4.2/seata-server-1.4.2.tar.gz
在conf文件夹修改file.conf文件
- 修改如下几行
mode = "db"url = "jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true"
user = "mysql"
password = "mysql"
向本地数据库导入seata需要的表
- 创建名字为seata的数据库
- 新建表branch_table、global_table、lock_table
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,`lock_key` varchar(128) 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 DEFAULT NULL,`gmt_modified` datetime DEFAULT NULL,PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;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=utf8mb3;CREATE TABLE `lock_table` (`row_key` varchar(128) NOT NULL,`xid` varchar(96) DEFAULT NULL,`transaction_id` mediumtext,`branch_id` mediumtext,`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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
修改registry.conf文件
registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"nacos {application = "seata-server"serverAddr = "127.0.0.1:8848"group = "SEATA_GROUP"namespace = ""cluster = "default"username = ""password = ""}
}config {# file、nacos 、apollo、zk、consul、etcd3type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = ""group = "SEATA_GROUP"username = ""password = ""dataId = "seataServer.properties"}
|
将seata配置信息添加到nacos配置中心
group 为 SEATA_GROUP
service.vgroupMapping 要和项目中
spring.cloud.alibaba.seata.tx-service-group
一致
service.vgroupMapping.order-service-group = default
启动seata server
./seata-server.sh -h 192.168.56.112
springcloud整合seata
项目地址:https://github.com/fafeidou/fast-cloud-nacos/tree/master/seata 可以参考
项目流程:用户下单时,创建订单是一个微服务(order-service-2pc),扣减库存是另外一个微服务(storage-service-2pc),默认是AT模式。
项目准备:创建两个数据库,分别是seata_storage
与seata_order
,两个数据执行文件分别为seata_storage.sql
、seata_order.sql
(在storage-service-2pc目录下)
测试流程
正常下单流程
- 初始化库存为1000
- 访问 http://localhost:9091/order/placeOrder/commit
- 查询库存表及订单表,生成了订单及扣减库存成功
扣减库存失败流程
- 访问 http://localhost:9091/order/placeOrder/rollback
- 查询库存服务日志
- 检查订单表和库存表,没有生成新的订单及扣减库存,分布式事务成功回滚了
- 查看seata server 日志,发现有回滚日志。发现事务id和服务中的事务id是同一个(192.168.56.112:8091:4107905583825276934)