seata分布式事务解决⽅案
分布式事务的处理过程为
⼀ID+三组件模型
核⼼概念
⼀ID
全局事务的id
三组件概念
1、TC(Transaction Coordinator)-事务协调者
维护全局和分⽀事务的状态,驱动全局事务提交或回滚
2、TM(Transaction Manager)-事务管理者
定义全局事务的范围:开始全局事务、提交或回滚全局事务
3、RM(Resource Manager)-资源管理器
管理分⽀事物处理的资源,与TC交谈以注册分⽀事务和报告分⽀事务的状态,并驱动分⽀事务提交或回滚
处理流程图
说明:
1、TM向TC申请开启⼀个全局事务,全局事务创建成功并⽣成⼀个全局唯⼀的XID
2、XID在微服务传播链路上下⽂中传播
3、RM向TC注册分⽀事务,将其纳⼊XID对应全局事务的管辖
4、TM向TC发起针对XID的全局提交或回滚决议
5、TC调度XID下管辖的全部分⽀事务完成提交或或回滚请求
seata的环境搭建配置
⼀、seata的下载
⼆、seata的安装
1、修改f⾃定义事务组名称+事务⽇志模式为db+数据库连接1、service的_test_tx_group属性
service {
#vgroup->rgroup
_test_tx_group = "fsp_tx_group"
#only support single node
#degrade current not support
enableDegrade = false
#disable
disable = false
#unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanent
}
mysql下载jar包2、指定存储⽅式为数据库
store {
## store mode: file、db
mode = "db"
...
## database store
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 = "sql.jdbc.Driver"
url = "jdbc:mysql://127.0.0.1:3306/seata"
user = "root"
password = "123456"
min-conn = 1
max-conn = 3
global.table = "global_table"
branch.table = "branch_table"
lock-table = "lock_table"
query-limit = 100
}
}
3、创建数据库seata,并且创建表
-- 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`)
);
2、修改f注册信息
修改注册类型为nacos,并且指定nacos的注册地址为localhost:8848(根据⾃⼰的nacos配置)
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
serverAddr = "localhost:8848"
namespace = ""
cluster = "default"
}
...
启动验证是否成功配置
1、启动nacos
2、启动seata(双击seata-server.bat到注册进nacos的注册语句即可)
三、准备业务表结构
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论