文章目录
- 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:latest
container_name: nacos-standalone
environment:
- PREFER_HOST_MODE=hostname
- MODE=standalone
volumes:
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- 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_network
volumes:
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、sofa
type = "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、etcd3
type = "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
springcloudseata_190">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)