分布式事务之Seata详解


上一篇:分布式事务之二阶段提交、AT模式、TCC模式


Seata Server环境搭建

Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成,我们只需要加入SpringCloudalibaba的一个依赖就会自动帮我们集成。

官方文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NjNiAq9l-1658039577421)(E:\Java笔记\image\springcloud_alibaba\image-20220704161147631.png)]

大致的步骤如下:

  • 步骤一:下载包

    下载地址,具体下载什么版本的Seata还需要参考SpringCloud alibaba各个组件版本对应的表格

  • 步骤二:建数据表

    全局事务会话信息由3块内容构成,全局事务–>分支事务–>全局锁,对应表global_table、branch_table、lock_table

  • 步骤三:修改store.mode文件

    启动包: seata–>conf–>application.yml,修改store.mode=“db或者redis”
    源码: 根目录–>seata-server–>resources–>application.yml,修改store.mode=“db或者redis”

    1.5.0以下版本:

    启动包: seata–>conf–>file.conf,修改store.mode=“db或者redis”
    源码: 根目录–>seata-server–>resources–>file.conf,修改store.mode=“db或者redis”

  • 步骤四:修改数据库连接或者redis属性配置

    启动包: seata–>conf–>application.example.yml中附带额外配置,将其db|redis相关配置复制至application.yml,进行修改store.db或store.redis相关属性。
    源码: 根目录–>seata-server–>resources–>application.example.yml中附带额外配置,将其db|redis相关配置复制至application.yml,进行修改store.db或store.redis相关属性。

    1.5.0以下版本:

    启动包: seata–>conf–>file.conf,修改store.db或store.redis相关属性。
    源码: 根目录–>seata-server–>resources–>file.conf,修改store.db或store.redis相关属性。

  • 步骤五:启动

    • 源码启动: 执行ServerApplication.java的main方法
    • 命令启动: seata-server.sh -h 127.0.0.1 -p 8091 -m db

    1.5.0以下版本

    • 源码启动: 执行Server.java的main方法
    • 命令启动: seata-server.sh -h 127.0.0.1 -p 8091 -m db -n 1 -e test
        -h: 注册到注册中心的ip
        -p: Server rpc 监听端口
        -m: 全局事务会话信息存储模式,file、db、redis,优先读取启动参数 (Seata-Server 1.3及以上版本支持redis)
        -n: Server node,多个Server时,需区分各自节点,用于生成不同区间的transactionId,以免冲突
        -e: 多环境配置参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html
    

首先我们修改DB数据源

Seata Server它作为一个事务协调者TC,那它肯定需要存储很多关于全局事务的会话信息

全局事务会话信息由3块内容构成,全局事务–>分支事务–>全局锁,对应表global_table、branch_table、lock_table

Server端存储模式支持三种:

  • file:单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,读写性能较高,也是默认的方式
  • db:高可用集群模式,全局事务会话信息通过DB共享,性能相对较差
  • redis:Seata-server1.3开始支持,性能较高,存在事务信息丢失风险,请提前配置适合当前场景的redis持久化配置

第一步、这里使用DB的存储模式,需要修改conf/file.conf文件,主要就是修改mode = "db"以及数据库的连接信息

store {
   

	# 这里需要将默认的file修改为db,还有下方的数据库连接信息
  mode = "db"

  db {
   
    datasource = "druid"
    dbType = "mysql"
    driverClassName = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://127.0.0.1:3306/seata_server"
    user = "XXXX"
    password = "XXXX"
    minConn = 5
    maxConn = 30
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}

需要注意,这里数据库需要用5.7+的版本。

第二步、按照上面文件所写的,创建一个seata_server的数据库

第三步、导入建表语句,官网sql链接,我们可以将这个下载下来然后放在seata目录下,sql位置:server/db/mysql.sql

-- -------------------------------- 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_gmt_modified_status` (`gmt_modified`, `status`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值