在使用微服务中,单体事务注解@Transactional
就不适用了,需要采用分布式事务解决方案,本文介绍分布式事务Seata
的安装 。Seata
一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务 。
seata
版本: 1.5.2
文章插图
前提准备
Seata
是一个分布式事务,seata
服务端也是一个微服务
,需要和其他微服务一样需要注册中心
和配置中心
。同时事务回滚,需要数据库日志记录 。- 注册中心和配置中心:
nacos
- 数据库:
mysql
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);
全局事务会话由:全局事务、分支事务、全局锁,对应表分别为3.配置 nacos在global_table
、branch_table
、lock_table
。
nacos
控制台添加新的命名空间:文章插图
添加一条
seata
,命名空间ID
在后面需要用到:文章插图
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
文章插图
执行脚本之后 , 输出以下脚本:
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
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 下 Vitepress搭建组件库文档—— 组件 Demo
- 四十七 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
- 三 AIR32F103 Linux环境基于标准外设库的项目模板
- 3 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - 入门Flask微框架
- Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务
- 从0搭建vue3组件库:自动化发布、管理版本号、生成 changelog、tag
- NAS数据存储之NFS搭建和使用
- three.js 如何用webgl搭建一个3D库房,3D仓库,3D码头,3D集装箱可视化孪生系统——第十五课
- 四十六 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
- 从0搭建vue3组件库: 如何完整搭建一个前端脚手架?