大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。
本项目是以官网的给的示例(即下图)进行创建的,以Eureka为注册中心。
官网:Seata AT 模式 | Apache Seata™
官方代码示例:
快速启动 | Apache Seata™
此文章涉及的项目代码链接:seata-at: 分布式事务解决方案Seata 的AT模式
前期准备
1、下载seata-server (下载地址:https://seata.io/zh-cn/unversioned/download/seata-server ),本项目用的当前最新版seata-server-2.0.0.zip
2、JDK版本需要JDK8或者更高,本项目使用的JDK11
3、此项目SpringBoot的创建采用的阿里的初始化连接(https://start.aliyun.com/ ),修改方式可见附录
注:本项目采用eureka为注册中心;
项目搭建
数据库准备
根据官方示例建立三个数据库:storage、order、account;
账户库:seata_account
DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- SEATA AT 模式需要 UNDO_LOG 表
DROP TABLE IF EXISTS `undo_log`;
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=9 DEFAULT CHARSET=utf8;
订单库:seata_order
DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`commodity_code` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- SEATA AT 模式需要 UNDO_LOG 表
DROP TABLE IF EXISTS `undo_log`;
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=9 DEFAULT CHARSET=utf8;
仓库库:seata_storage
DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`commodity_code` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- SEATA AT 模式需要 UNDO_LOG 表
DROP TABLE IF EXISTS `undo_log`;
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=9 DEFAULT CHARSET=utf8;
项目创建
创建项目 seata-at,依次创建子模块 account、order、 storage、business、eureka、common,项目结构如图:
需要修改seata-server的eureka注册配置(seata-server-2.0.0\conf\application.yml),如下:
seata:
config:
# support: nacos, consul, apollo, zk, etcd3
type: file
registry:
type: eureka
eureka:
service-url: http://localhost:8761/eureka
application: default
weight: 1
项目中的 account、order、storage 模块中的resource/file.conf 文件中:修改 service 的内容由:
vgroup_mapping.business-service-seata-service-group = "default"
改为
vgroup_mapping.my_test_tx_group = "default"
项目中的 account、order、storage 模块中的resource/registry.conf文件 :修改registry的内容
type = "eureka"
application.properties 文件注意 seata.tx-service-group 无效,改用spring.cloud.alibaba.seata.tx-service-group,如下:
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group
#使用无效 #seata.tx-service-group=my_test_tx_group
seata.service.disable-global-transaction=false
启动和测试
启动顺序:eureka 、seata-server(外部服务)、 account、storage、 order、 business
测试采用的Postman。
附录
Spring项目初始化链接修改
点击Server URL 的设置按钮,修改链接为:https://start.aliyun.com/ ,点击确认即可。