Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。☞ 官网
系统架构发展到如今的微服务,每个服务都对应相应的数据库,库存服务对应库存库,订单服务对应订单库,如果没有分布式事务,在非正常情况下,下订单时库存减了却没有订单增加岂不是尴尬了。这种时候必须要保证数据的一致性。单数据源的一致性依靠单机事务来保证,多数据源的一致性就要依靠分布式事务。
| 术语 | 描述 |
|---|---|
| XID (Transaction ID) | 全局唯一事务 ID |
| TC (Transaction Coordinator) | 事务协调者,维护全局和分支事务的状态,驱动全局事务提交或回滚。 |
| TM (Transaction Manager) | 事务管理器,定义全局事务的范围:开始全局事务、提交或回滚全局事务。 |
| RM (Resource Manager) | 资源管理器,管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 |
1.2.2 处理过程
♞ TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID;
♞ XID 在微服务调用链路的上下文中传播;
♞ RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖;
♞ TM 向 TC 发起针对 XID 的全局提交或回滚决议;
♞ TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
简单来说上述过程类似于
♞ 班长[TM]向辅导员[TC]申请开班会,并定了开会的会议室[XID]
♞ 将会议室的地点公布
♞ 同学[RM]跟辅导员[TC]签到
♞ 班长[TM]跟辅导员[TC]说我们要干这个事情
♞ 辅导员[TC]通知到所有人要干这个事
♞ 先去 ☞ GitHub 下载对应的安装包,解压后得到如下文件夹
♞ 修改 /conf/file.conf
♞ 创建 seata 数据库,创建相关表,0.9 之后的版本没有 sql,0.9 及之前的在 conf 中可以找到 db_store.sql
-- the table to store GlobalSession data drop table if exists `global_table`; create table `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`) ); -- the table to store BranchSession data drop table if exists `branch_table`; create table `branch_table` ( `branch_id` bigint not null, `xid` varchar(128) not null, `transaction_id` bigint , `resource_group_id` varchar(32), `resource_id` varchar(256) , `lock_key` varchar(128) , `branch_type` varchar(8) , `status` tinyint, `client_id` varchar(64), `application_data` varchar(2000), `gmt_create` datetime, `gmt_modified` datetime, primary key (`branch_id`), key `idx_xid` (`xid`) ); -- the table to store lock data drop table if exists `lock_table`; create table `lock_table` ( `row_key` varchar(128) not null, `xid` varchar(96), `transaction_id` long , `branch_id` long, `resource_id` varchar(256) , `table_name` varchar(32) , `pk` varchar(36) , `gmt_create` datetime , `gmt_modified` datetime, primary key(`row_key`) );
♞ 修改 /conf/registry.conf
♞ 下载源码在 /script/config-center 中修改 config.txt
# 事务分组名称,自定义 service.vgroupMapping.my_test_tx_group=my_seata_tx_group # Seata 启动的地址和端口号,本地就写 127.0.0.1 外网就写外网地址 service.default.grouplist=127.0.0.1:8091 store.db.dbType=mysql store.db.driverClassName=com.mysql.jdbc.Driver store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true store.db.user=root store.db.password=root
♞ 加载配置,进入 /script/config-center/nacos 执行 sh nacos-config.sh -h nacos_ip -p 8848 执行完毕后可以在 Nacos 看到加载的配置。
♞ 执行 /bin/seata-server.bat 启动,p 参数可以指定端口,h 参数可以指定 ip
1.3.2 Linux
Linux 的安装与 Windows 的方式一致,只不过是安装包不同与启动脚本不同而已



