官方文档:https://seata.io/zh-cn/docs/overview/what-is-seata.html
seata是什么
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
术语
- TC-事务协调者(seata服务器):维护全局和分支事务的状态,驱动全局事务提交或回滚
- TM-事务管理器(事务的发起方,@GloablTransactional标签下):定义全局事务的范围,开始全局事务、提交或回滚全局事务
- RM-资源管理器(事务的参与方,库表):管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚
过程
1. TM向TC申请开启一个全局事务,全局事务创建成功并生成个全局唯 的XID;
2. XID在微服务调用链路的上下文中传播;
3. RM向TC注册分支事务,将其纳入XID对应全局事务的管辖;
4. TM向TC发起针对XID的全局提交或回滚决议:
5. TC调度XID下管辖的全部分支事务完成提交或回滚请求。
下载
seata-server-1.0
配置
修改file.conf文件
service {
#transaction service group mapping
vgroup_mapping.my_test_tx_group = "qyc_tx_group"
#only support when registry.type=file, please don't set multiple addresses
default.grouplist = "127.0.0.1:8091"
#disable seata
disableGlobalTransaction = false
}## transaction log store, only used in seata-server
store {
## store mode: file、db
mode = "db"## file store property
file {
## store location dir
dir = "sessionStore"
}## database store property
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
datasource = "dbcp"
## mysql/oracle/h2/oceanbase etc.
db-type = "mysql"
driver-class-name = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://127.0.0.1:3306/seata"
user = "root"
password = "123456"
}
}
修改registry.conf
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"nacos {
serverAddr = "localhost:8848"
namespace = ""
cluster = "default"
}
eure
建库
创建seata数据库,执行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`)
);
运行
先启动nacos再启动seata
实例
这里我们会创建三个服务,订单服务,,库存服务,账户服务。
当用户下单时,会在订单服务中创建一个订单 ,然后通过远程调用库存服务来扣减下单商品的库存,
再通过远程调用账户服务来扣减用户账户里面的余额,
最后在订单服务中修改订单状态为已完成。
该操作跨越三个数据库,有两次远程调用,很明显会有分布式事务问题。
建库
create database seata_order; 订单
create database seata_storage; 库存
create database seata_account; 账户
建表
t_account
t_order
t_storage
建立回滚日志表
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
效果:下订单->减库存->扣余额->改(订单)状态
注意:微服务的file.conf配置和上面的不一样
service {
#transaction service group mapping
vgroup_mapping.qyc_tx_group = "default"
#only support when registry.type=file, please don't set multiple addresses
default.grouplist = "127.0.0.1:8091"
#disable seata
disableGlobalTransaction = false
}
2001订单 application.xml
server:
port: 2001
spring:
application:
name: seata-order-2001
cloud:
nacos:
discovery:
server-addr: localhost:8848
alibaba:
seata:
tx-service-group: qyc_tx_group
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/seata_order
driver-class-name: com.mysql.jdbc.Driver
#logging:
# level: info
mybatis:
config-location: classpath:mybatis/mybatis.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#management:
# endpoints:
# web:
# exposure:
# include: "*"
具体代码 2001 2002 2003
https://github.com/qycwudi/AlibabaCloud