下载
seata下载地址
这两个都需要
太慢下不了的用下面的链接
链接:https://pan.baidu.com/s/1VH40aWWf8ejBolwTLLmh2w
提取码:dc8p
修改seata配置
在nacos里面配置命名空间,不指定会使用默认的
解压seata-server-1.4.2.zip 修改 seata-server-1.4.2\conf\下的 registry.conf文件,这里使用的是nacos作为配置文件,别的我都删了
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = "seata_namespace"
cluster = "default"
username = "nacos"
password = "nacos"
}
}
config {
type = "nacos"
nacos {
serverAddr = "127.0.0.1:8848"
namespace = "seata_namespace"
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
dataId = "seataServer.properties"
}
}
红框里面改为自己的配置
然后修改file.conf文件
## transaction log store, only used in seata-server
store {
## store mode: file、db、redis
mode = "db"
## rsa decryption public key
publicKey = ""
## database store property
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
datasource = "druid"
## mysql/oracle/postgresql/h2/oceanbase etc.
dbType = "mysql"
driverClassName = "com.mysql.cj.jdbc.Driver"
## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
url = "jdbc:mysql://192.168.0.150:3307/seata?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true"
user = "root"
password = "root"
minConn = 5
maxConn = 100
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
}
这里主要是配置数据库信息,注意我用的8.0的MySQL,5.+的包路径没有cj
解压seata源码,在seata-1.4.2\script\config-center\找到 config.txt文件
复制到seata根目录下
修改config.txt,主要的修改点
在下载的Seata源码的seata-1.4.2/script/config-center/nacos目录下找到nacos-config.sh文件
复制到seata根目录下
使用git命令执行脚本
sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t seata_namespace -u nacos -w nacos
执行完成后nacos会生成配置文件
创建相关的库表
创建seata库,在库里创建seata需要的表
建表sql在 \seata-1.4.2\script\server\db
-- -------------------------------- 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 = utf8;
-- 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 = utf8;
-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
`row_key` VARCHAR(128) NOT NULL,
`xid` VARCHAR(128),
`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 = utf8;
双击启动seata
启动后nacos里面会看到已经注册成功
在需要整合seata的项目使用的库里添加 undo_log 表
CREATE TABLE `undo_log` (
`branch_id` bigint NOT NULL COMMENT 'branch transaction id',
`xid` varchar(128) 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 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 DEFAULT CHARSET=utf8mb3 COMMENT='AT transaction mode undo table';
这个表会记录每一次操作的sql,后续如果需要回滚会根据这个表生成逆sql
整合到项目中
在每个服务里面添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
修改 system的yml配置文件
spring:
application:
name: system
cloud:
nacos:
discovery:
server-addr: ${NACOS_DISCOVERY_SERVER_ADDR:localhost:8848}
ip: ${NACOS_DISCOVERY_IP:localhost}
port: ${server.port}
alibaba:
seata:
tx-service-group: server_system_tx_group
seata:
application-id: system
service:
vgroup-mapping:
server-product-tx_group: default
registry:
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
group: SEATA_GROUP
namespace: seata_namespace
application: seata-server
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
group: SEATA_GROUP
namespace: seata_namespace
这两快是后面添加上去的
修改 ops的yml配置文件
server:
port: 8217
spring:
application:
name: ops
cloud:
nacos:
discovery:
server-addr: ${NACOS_DISCOVERY_SERVER_ADDR:localhost:8848}
ip: ${NACOS_DISCOVERY_IP:localhost}
port: ${server.port}
alibaba:
seata:
tx-service-group: server_ops_tx_group
seata:
application-id: ops
service:
vgroup-mapping:
server-order-tx_group: default
registry:
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
group: SEATA_GROUP
namespace: seata_namespace
application: seata-server
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
group: SEATA_GROUP
namespace: seata_namespace
两个配置只有这里有区别
测试
在方法入口处加上 @GlobalTransactional
被调用方
常见问题排查
1.项目无法注册到Seata,找不指定的group
can not get cluster name in registry config ‘service.vgroupMapping.xx‘, please make sure registry
查看配置文件config.txt
service.vgroupMapping.server_system_tx_group=default
service.vgroupMapping.server_ops_tx_group=default
和项目中填写的group是否一致
再看看nacos里面的配置
执行脚本时没有出错会在这里生成,如果nacos里面没有,检测修改配置文件后再使用git命令执行脚本