seata简介
对于想玩的更多,理解更多的可以去官网:seata中文官网 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
seata解决了什么问题
单体应用被拆分成微服务应用,原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源,业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据的一致性问题没法保证。
seata专业术语,重要概念
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
XID:全局唯一事务ID
TC,TM,RM,XID在整个分布式事务中的作用入下图(来源官网)所示
- TM向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID;
- XID在微服务调用链路的.上下文中传播;
- RM向TC注册分支事务,将其纳入XID对应全局事务的管辖;
- TM向TC发起针对XID的全局提交或回滚决议;
- TC调度XID下管辖的全部分支事务完成提交或回滚请求。
seata下载
下载地址选择自己的版本即可:下载地址 下载完成之后直接解压即可。太简单了就不废话了。O(∩_∩)O哈哈~
seata安装及修改配置
主要修改:事务日志存储模式修改为DB+数据库连接信息+注册中心
- 事务日志存储模式修改为DB+数据库连接信息
1.打开seata下面的conf文件夹下面的file.conf,修改为db模式,并且修改数据库配置 - 修改注册中心
打开conf目录下面registry.conf,将注册中心修改为nacos注意事项:
- seata在1.4X之后不在conf文件下面提供sql了,需要去conf目录下面打开README-zh.md找对应的sql和config.txt和nacos-cofnig.sh。sql地址:回滚sql,seata库sql
- seata暂时没有mysql8.0以上的jar包(mysql-connector-java-8.0.17.jar),需要手动将jar放入到lib下面,并且将5.0X版本删除
config.txt*
git文件地址:git地址nacos-config.sh
github地址:git文件地址建立seata数据库,运行sql
-- -------------------------------- 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
在启动seata之前必须启动nacos
# 初始化seata 的nacos配置
cd conf
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -u nacos -w nacos
# 启动seata-server
cd bin
sh seata-server.sh -p 8091 -m file