目录
1.背景
前一阵粗浅地研究了一下Seata,一直没有时间记录,拖了很久还是回想一下,简单记录一个吧。
2.问题的由来
通常,事务要满足的4个属性:原子性、一致性、隔离性、持久性。在单体应用的时候,数据库和应用都在一处,事务的属性大多由数据库来保证。但自从微服务工程兴起,就出现一个业务可能操作多个数据库,多张表的情况。那么问题来了,此时的事务4属性该如何保证呢。于是,就出现了Seata。Seata是一款开源的分布式事务解决方案,为用户提供了AT/TCC/SAGA/XA模式。
3.术语
- TC(Transaction Coordinator)-- 事务协调者。维护全局和分支事务的状态,驱动全局事务提交或回滚
- TM(Transaction Manager)-- 事务管理器。定义全局事务的范围:开始全局事务、提交或回滚全局事务
- RM(Resource Manager)-- 资源管理。管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚
4.安装
seata是server/client结构,其安装的方式有很多种:直接部署、Docker部署、Docker Compose部署、K8S部署、Helm部署等。这里以最为简单的直接部署为例。
首先,在如下地址下载seata-server。
https://github.com/seata/seata/releases
解压后,到bin目录下启动:seata-server.bat 文件即可(注意:启动前,需要先建好seata数据库)。Client端的安装和使用在后文中继续介绍。
CREATE DATABASE IF NOT EXIST `seata`;
USE `SEATA`;
CREATE TABLE IF NOT EXISTS `branch_table`(
`branch_id` bigint(20) NOT NULL,
`xid` varchar(128) NOT NULL,
`transaction_id` bigint(20) DEFAULT NULL,
`resource_group_id` varchar(32) DEFAULT NULL,
`resource_id` varchar(256) DEFAULT NULL,
`branch_type` varchar(8) DEFAULT NULL,
`status` tinyint(4) DEFAULT NULL,
`client_id` varchar(64) DEFAULT NULL,
`application_data` varchar(2000) DEFAULT NULL,
`gmt_create` datetime(6) DEFAULT NULL,
`gmt_modified` datetime(6) DEFAULT NULL,
PRIMARY KEY (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `distributed_lock`(
`lock_key` char(20) NOT NULL,
`lock_value` varchar(20) NOT NULL,
`expire` bigint(20) DEFAULT NULL,
PRIMARY KEY (`lock_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `global_table`(
`xid` varchar(128) NOT NULL,
`transaction_id` bigint(20) DEFAULT NULL,
`status` tinyint(4) DEFAULT NULL,
`application_id` varchar(32) DEFAULT NULL,
`transaction_service_group` varchar(32) DEFAULT NULL,
`transaction_name` varchar(128) DEFAULT NULL,
`timeout` int(11) DEFAULT NULL,
`begin_time` bigint(20) DEFAULT NULL,
`application_data` varchar(2000) DEFAULT NULL,
`gmt_create` datetime DEFAULT NULL,
`gmt_modified` datetime DEFAULT NULL,
PRIMARY KEY (`xid`),
KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
KEY `idx_transanction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `lock_table`(
`row_key` varchar(128) NOT NULL,
`xid` varchar(128) NOT NULL,
`transaction_id` bigint(20) DEFAULT NULL,
`branch_id` bigint(20) NOT NULL,
`resource_id` varchar(256) DEFAULT NULL,
`table_name` varchar(32) NOT NULL,
`pk` varchar(36) DEFAULT NULL,
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0:locked, 1:rollbacking',
`gmt_create` datetime DEFAULT NULL,
`gmt_modified` datetime DEFAULT NULL,
PRIMARY KEY (`row_key`),
KEY `idx_status` (`status`),
KEY `idx_branch_id` (`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
5.参考资料
Seata 是什么 -- 官网