下载
地址:https://seata.apache.org/zh-cn/release-history/seata-server
关键目录说明:
bin 执行脚本
conf 配置文件
执行数据库脚本
脚本也可在下载seata文件中的 \script\server\db 目录中找到
-- -------------------------------- 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_status_gmt_modified` (`status` , `gmt_modified`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- 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 = utf8mb4;
-- 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),
`status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_status` (`status`),
KEY `idx_branch_id` (`branch_id`),
KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS `distributed_lock`
(
`lock_key` CHAR(20) NOT NULL,
`lock_value` VARCHAR(20) NOT NULL,
`expire` BIGINT,
primary key (`lock_key`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
配置
seataServer配置文件
seata的conf中的application.yml 配置
server:
port: 7099 #端口
spring:
application:
name: seata-server #服务名
logging:
config: classpath:logback-spring.xml
file:
path: ${user.home}/logs/seata #日志文件地址
# extend:
# logstash-appender:
# destination: 127.0.0.1:4560
# kafka-appender:
# bootstrap-servers: 127.0.0.1:9092
# topic: logback_to_logstash
console:
user:
username: admin
password: admin # 控制台登录用户名密码
seata:
config:
# support: nacos, consul, apollo, zk, etcd3 #seata的配置方式
type: nacos # 选用一个配置方式,此处选用nacos
nacos:
server-addr: 127.0.0.1:8848 # 你的nacos地址
group : "DEFAULT_GROUP"
namespace: "" # 指定命名空间 空则走默认的public
dataId: "seataServer.yml" # 指定配置文件的DataID
username: "nacos" # nacos的用户名及密码
password: "nacos"
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa #seata的注册中心
type: nacos # 选择一个注册中心,此处选用nacos
nacos:
application: seata-server # 指定应用的名称 与{spring.application.name}一致
server-addr: 127.0.0.1:8848 # 指定nacos的地址
group : "DEFAULT_GROUP" # 指定nacos的分组 一般用默认DEFAULT_GROUP
namespace: "" # 指定命名空间 空则为默认public
username: "nacos" # nacos的用户名密码
password: "nacos"
# server:
# service-port: 8091 #If not configured, the default is '${server.port} + 1000'
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login
由于上方我们选择了nacos配置中心,并指定了dataId=seataServer.yml,因此我们需要在nacos中新建一个配置
store:
mode: db # 指定数据存储模式为数据库
db: #数据库的连接配置
datasource: druid
dbType: mysql
driverClassName: com.mysql.jdbc.Driver #此处请注意 5.x版本请使用com.mysql.jdbc.Driver 8以上版本请使用 com.mysql.cj.jdbc.Driver
url: jdbc:mysql://{你自己的数据库ip}:3306/seata?useUnicode=true
user: {数据库连接名}
password: {数据库连接密码}
global-table: global_table
lock-table: lock_table
branch-table: branch_table
distributed-lock-table: distributed_lock
maxConn: 30
maxWait: 5000
minConn: 5
queryLimit: 100
seataClient配置,即使用seata的微服务配置
引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
配置文件
seata:
registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
type: nacos # 注册中心类型 nacos
nacos:
server-addr: 127.0.0.1:8848 # nacos地址
namespace: "" # namespace,默认为空
group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
application: seata-server # seata服务名称
username: nacos
password: nacos
tx-service-group: hmall # 事务组名称
service:
vgroup-mapping: # 事务组与tc集群的映射关系
hmall: "default"
data-source-proxy-mode: AT # 一般使用XA AT,默认为AT
XA 与 AT 模式说明
XA :属于强一致性的模式,在全局事务进入第二阶段 全部成功时,分支事务才会去人提交
AT:数据最终一致性模式,每个分支事务完成都会直接提交,但在提交前会保存一个快照,记录提交前的状态,当全局事务处理完成,若全部成功则删除快照,若失败则执行快照的方式回滚
由于上方说明可知AT模式需要每个微服务数据库增加一个undo_log的日志表,所有使用AT模式,需要在每个微服务的数据库创建undo_log的表,sql如下:
-- 注意此处0.7.0+ 增加字段 context
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,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
微服务的修改
XA与AT模式对业务代码都是0侵入的,因此使用上十分简单,
第一步:配置配置文件,选择一种模式,这一步在上方的seataClient配置中已经完成
第二步:在需要用到分布式事务的方法上加上@GlobalTransactional,在局部事务上也需要加上原始的@Transactional注解
完成后分布式事务的构建已经完成了