Seata 环境搭建

在使用微服务中,单体事务注解@Transactional 就不适用了,需要采用分布式事务解决方案,本文介绍分布式事务Seata的安装 。Seata一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务 。
seata版本: 1.5.2
Seata 环境搭建

文章插图
前提准备Seata是一个分布式事务,seata服务端也是一个微服务,需要和其他微服务一样需要注册中心配置中心 。同时事务回滚,需要数据库日志记录 。
  • 注册中心和配置中心: nacos
  • 数据库: mysql
1.下载进入Seata官网下载,下载版本是1.5.2,找到seata-server-1.5.1.tar.gz下载 。解压文件后进入seata文件 。
2.建表【Seata 环境搭建】新建数据库seata,然后在seata文件夹里面的script文件,找到server —> db —> mysql.sql,在数据库中执行sql语句:
-- the table to store GlobalSession dataCREATE TABLE IF NOT EXISTS `global_table`(`xid`VARCHAR(128) NOT NULL,`transaction_id`BIGINT,`status`TINYINTNOT 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_status_gmt_modified` (`status` , `gmt_modified`),KEY `idx_transaction_id` (`transaction_id`)) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store BranchSession dataCREATE TABLE IF NOT EXISTS `branch_table`(`branch_id`BIGINTNOT 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 = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store lock dataCREATE TABLE IF NOT EXISTS `lock_table`(`row_key`VARCHAR(128) NOT NULL,`xid`VARCHAR(128),`transaction_id` BIGINT,`branch_id`BIGINTNOT NULL,`resource_id`VARCHAR(256),`table_name`VARCHAR(32),`pk`VARCHAR(36),`status`TINYINTNOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',`gmt_create`DATETIME,`gmt_modified`DATETIME,PRIMARY KEY (`row_key`),KEY `idx_status` (`status`),KEY `idx_branch_id` (`branch_id`),KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE IF NOT EXISTS `distributed_lock`(`lock_key`CHAR(20) NOT NULL,`lock_value`VARCHAR(20) NOT NULL,`expire`BIGINT,primary key (`lock_key`)) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
全局事务会话由:全局事务、分支事务、全局锁,对应表分别为global_tablebranch_tablelock_table
3.配置 nacos在nacos控制台添加新的命名空间:
Seata 环境搭建

文章插图
添加一条seata命名空间ID在后面需要用到:
Seata 环境搭建

文章插图
3.1 上传配置至Nacos配置中心进到seata目录中,找到nacos-config.sh文件,路径:script -> config-center -> nacos -> nacos-config.sh 。执行nacos-config.sh脚本:
sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t xxxx -u username -w password参数详解:
  • -h nacos服务IP
  • -p nacos服务端口
  • -u nacos登录名
  • -w nacos登录密码
  • -g nacos 配置的分组名称,默认设置SEATA_GROUP
  • -t 上一步配置的命名空间ID

Seata 环境搭建

文章插图
执行脚本之后 , 输出以下脚本:
Set server.maxCommitRetryTimeout=-1 successfullySet server.maxRollbackRetryTimeout=-1 successfullySet server.rollbackRetryTimeoutUnlockEnable=false successfullySet server.distributedLockExpireTime=10000 successfullySet server.xaerNotaRetryTimeout=60000 successfullySet server.session.branchAsyncQueueSize=5000 successfullySet server.session.enableBranchAsyncRemove=false successfullySet server.enableParallelRequestHandle=false successfullySet metrics.enabled=false successfullySet metrics.registryType=compact successfullySet metrics.exporterList=prometheus successfullySet metrics.exporterPrometheusPort=9898 successfully

推荐阅读