「seata」分布式事务seata部署及应用

「seata」分布式事务seata部署及应用

  • seata 版本
  • 一、部署seata服务
    • 1、配置config.txt文件中的属性值
    • 2、为seata服务单独创建一个nacos命名空间
    • 3、利用脚本上传配置文件到nacos
    • 4、配置seata服务的application.yml
    • 6、执行数据库脚本
    • 5、使用脚本启动seata服务
  • 二、配置并启动微服务
    • 1、配置每个微服务的application.yml文件
    • 2、在每个微服务所在的数据库执行undo_log数据表结构
    • 3、启动微服务向seata注册分支事务
  • 三、模式解读
    • XA和AT的区别
    • 1、XA模式
      • 1.1 XA模式
        • 两阶段
      • 1.2 XA架构模型
      • 1.3 XA的优缺点
    • 2、AT模式
      • 1.1 AT模式
        • 两阶段
      • 1.2 AT架构模型
      • 1.3 执行流程
    • 3、TCC模式
      • 优缺点
    • 4、SAGA模式
      • 优缺点

seata 版本

seata-server-2.0.0

一、部署seata服务

1、配置config.txt文件中的属性值

目录:seata-server-2.0.0\seata\script\config-center
在这里插入图片描述
修改的存储事务在数据库中
事务路由规则配置,仅针对客户端(重点和难点)

# 默认配置就行
service.vgroupMapping.default_tx_group=default
store.mode=db
store.lock.mode=db
store.session.mode=db

修改数据库配置

store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
# 配置数据库
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
# 修改数据库用户名和密码
store.db.user=root
store.db.password=root123
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000

2、为seata服务单独创建一个nacos命名空间

在这里插入图片描述

命名空间名称:seata
命名空间ID:52b44c99-80b8-4902-8335-e1bf177e37ec
配置数:0 / 200
描述:分布式事务

3、利用脚本上传配置文件到nacos

前提条件:需要安装好git环境或者可以执行sh命令的运行环境
脚本目录:seata-server-2.0.0\seata\script\config-center\nacos
在这里插入图片描述
在窗口处执行命令:

sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 	52b44c99-80b8-4902-8335-e1bf177e37ec -u nacos -w nacos

在这里插入图片描述
执行过程:
在这里插入图片描述
导入成功:
在这里插入图片描述
允许nacos界面如图所示(成功导入了118个配置项):
在这里插入图片描述

4、配置seata服务的application.yml

所在目录:seata-server-2.0.0\seata\conf\application.yml
在这里插入图片描述
在原有配置项上进行更改

# 完整的配置内容
server:
  port: 7091

spring:
  application:
    name: seata-server

logging:
  config: classpath:logback-spring.xml
  file:
    path: ${log.home:${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
# 控制台访问密码
# http://localhost:7091/
console:
  user:
    username: seata
    password: seata
# seata基础配置,启动的时候需要这些配置项
seata:
  # 配置中心
  config:
    type: nacos  # 配置中心类型为Nacos
    nacos:
      server-addr: 127.0.0.1:8848  # Nacos服务器地址
      group: SEATA_GROUP  # 配置文件所属的分组
      username: nacos  # Nacos用户名
      password: nacos  # Nacos密码
      namespace: 52b44c99-80b8-4902-8335-e1bf177e37ec  # Nacos命名空间

  # 注册中心
  registry:
    type: nacos  # 注册中心类型为Nacos
    preferred-networks: 10.10.*  # 首选网络
    nacos:
      application: seata-server  # 应用名称
      server-addr: 127.0.0.1:8848  # Nacos服务器地址
      group: SEATA_GROUP  # 配置文件所属的分组
      username: nacos  # Nacos用户名
      password: nacos  # Nacos密码
      namespace: 52b44c99-80b8-4902-8335-e1bf177e37ec  # Nacos命名空间

  # Seata服务器配置
  server:
    raft:
      group: default
      cluster:
      snapshot-interval: 600
      apply-batch: 32
      max-append-bufferSize: 262144
      max-replicator-inflight-msgs: 256
      disruptor-buffer-size: 16384
      election-timeout-ms: 1000
      reporter-enabled: false
      reporter-initial-delay: 60
      serialization: jackson
      compressor: none
      sync: true  # 日志和快照同步到磁盘
    service-port: 8091  # 服务端口
    max-commit-retry-timeout: -1
    max-rollback-retry-timeout: -1
    rollback-retry-timeout-unlock-enable: false
    enable-check-auth: true
    enable-parallel-request-handle: true
    enable-parallel-handle-branch: false
    retry-dead-threshold: 130000
    xaer-nota-retry-timeout: 60000
    enableParallelRequestHandle: true
    recovery:
      committing-retry-period: 1000
      async-committing-retry-period: 1000
      rollbacking-retry-period: 1000
      timeout-retry-period: 1000
    undo:
      log-save-days: 7
      log-delete-period: 86400000
    session:
      branch-async-queue-size: 5000  # 分支异步移除队列大小
      enable-branch-async-remove: false  # 启用分支会话的异步移除

  # 监控配置
  metrics:
    enabled: false  # 是否启用监控
    registry-type: compact
    exporter-list: prometheus
    exporter-prometheus-port: 9898  # Prometheus导出器端口

  # 传输配置
  transport:
    rpc-tc-request-timeout: 15000
    enable-tc-server-batch-send-response: false
    shutdown:
      wait: 3
    thread-factory:
      boss-thread-prefix: NettyBoss
      worker-thread-prefix: NettyServerNIOWorker
      boss-thread-size: 1

  # 安全配置
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017  # 密钥
    tokenValidityInMilliseconds: 1800000  # 令牌有效期(毫秒)
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/metadata/v1/**  # 忽略的URL列表

6、执行数据库脚本

脚本所在目录:seata-server-2.0.0\seata\script\server\db
全局事务会话信息由3块内容构成,全局事务-->分支事务-->全局锁,对应表global_table、branch_table、lock_table
在这里插入图片描述
seata服务的完整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_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(1000),
    `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` (`xid`)
) 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);

5、使用脚本启动seata服务

脚本所在目录:seata-server-2.0.0\seata\bin\seata-server.bat
在这里插入图片描述

二、配置并启动微服务

1、配置每个微服务的application.yml文件

一共有三个微服务,执行逻辑是:

  1. 创建新订单
  2. 扣减商品库存
  3. 从用户账户余额扣除金额

在三个微服务的application.yml文件中配置如下内容:

# 启用 Seata 分布式事务功能
seata:
  enabled: true
  # 启用自动数据源代理模式
  enable-auto-data-source-proxy: true
  # 事务组名称,用于标识相同应用下的不同事务服务,默认为 default_tx_group
  tx-service-group: default_tx_group
  # 数据源代理模式,指定为 XA 模式
  data-source-proxy-mode: XA
  # 注册中心配置
  registry:
    # 注册中心类型为 Nacos
    type: nacos
    nacos:
      # Nacos 服务器地址
      server-addr: 127.0.0.1:8848
      # Nacos 配置文件所属的分组
      group: SEATA_GROUP
      # 注册到 Nacos 的应用名称
      application: seata-server
      # Nacos 用户名
      username: nacos
      # Nacos 密码
      password: nacos
      # Nacos 命名空间
      namespace: 52b44c99-80b8-4902-8335-e1bf177e37ec
  # 配置中心配置
  config:
    # 配置中心类型为 Nacos
    type: nacos
    nacos:
      # Nacos 服务器地址
      server-addr: 127.0.0.1:8848
      # Nacos 用户名
      username: nacos
      # Nacos 密码
      password: nacos
      # Nacos 配置文件所属的分组
      group: SEATA_GROUP
      # Nacos 命名空间
      namespace: 52b44c99-80b8-4902-8335-e1bf177e37ec

2、在每个微服务所在的数据库执行undo_log数据表结构

在每个微服务所在的数据库执行下面的回滚日志的SQL脚本

-- auto-generated definition
create table undo_log
(
    id            bigint auto_increment
        primary key,
    branch_id     bigint       not null,
    xid           varchar(100) not null,
    context       varchar(128) not null,
    rollback_info longblob     not null,
    log_status    int          not null,
    log_created   datetime     not null,
    log_modified  datetime     not null,
    ext           varchar(100) null,
    constraint ux_undo_log
        unique (xid, branch_id)
)
    engine = InnoDB
    charset = utf8;

3、启动微服务向seata注册分支事务

三个微服务都启动之后会向seata服务注册分支事务,如下图所示:
在这里插入图片描述

三、模式解读

XA和AT的区别

简述AT模式与XA模式最大的区别是什么?

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
  • XA模式强一致;AT模式最终一致

执行逻辑代码如下:
在这里插入图片描述
他们之间的区别可以打断点查看,一个会立即提交事务一个不会。

1、XA模式

1.1 XA模式

XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范
描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。

两阶段

XA是规范,目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。

正常情况:
在这里插入图片描述

异常情况:
在这里插入图片描述
一阶段:

  • 事务协调者通知每个事物参与者执行本地事务
  • 本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁

二阶段:

  • 事务协调者基于一阶段的报告来判断下一步操作
    • 如果一阶段都成功,则通知所有事务参与者,提交事务
    • 如果一阶段任意一个参与者失败,则通知所有事务参与者回滚事务

1.2 XA架构模型

Seata对原始的XA模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:
在这里插入图片描述
RM一阶段的工作:

​ ① 注册分支事务到TC

​ ② 执行分支业务sql但不提交

​ ③ 报告执行状态到TC

TC二阶段的工作:

  • TC检测各分支事务执行状态

    a.如果都成功,通知所有RM提交事务

    b.如果有失败,通知所有RM回滚事务

RM二阶段的工作:

  • 接收TC指令,提交或回滚事务

1.3 XA的优缺点

XA模式的优点是什么?

  • 事务的强一致性,满足ACID原则。
  • 常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

2、AT模式

1.1 AT模式

AT模式同样是分阶段提交的事务模型,不过弥补了XA模型中资源锁定周期过长的缺陷。

两阶段

阶段一RM的工作:

  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交
  • 报告事务状态

阶段二提交时RM的工作:

  • 删除undo-log即可

阶段二回滚时RM的工作:

  • 根据undo-log恢复数据到更新前

1.2 AT架构模型

在这里插入图片描述

1.3 执行流程

AT模式下,当前分支事务执行流程如下:

一阶段:

1)TM发起并注册全局事务到TC
2)TM调用分支事务
3)分支事务准备执行业务SQL
4)RM拦截业务SQL,根据where条件查询原始数据,形成快照。
5)RM执行业务SQL,提交本地事务,释放数据库锁。此时 money = 90
6)RM报告本地事务状态给TC
二阶段:
1)TM通知TC事务结束
2)TC检查分支事务状态
​ a)如果都成功,则立即删除快照
​ b)如果有分支事务失败,需要回滚。读取快照数据({"id": 1, "money": 100}),将快照恢复到数据库。此时数据库再次恢复为100
流程图:
在这里插入图片描述

3、TCC模式

TCC和SAGA不做详细介绍

优缺点

TCC模式的每个阶段是做什么的?

  • Try:资源检查和预留
  • Confirm:业务执行和提交
  • Cancel:预留资源的释放

TCC的优点是什么?

  • 一阶段完成直接提交事务,释放数据库资源,性能好
  • 相比AT模型,无需生成快照,无需使用全局锁,性能最强
  • 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库

TCC的缺点是什么?

  • 有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦
  • 软状态,事务是最终一致
  • 需要考虑Confirm和Cancel的失败情况,做好幂等处理

4、SAGA模式

TCC和SAGA不做详细介绍

优缺点

优点:

  • 事务参与者可以基于事件驱动实现异步调用,吞吐高
  • 一阶段直接提交事务,无锁,性能好
  • 不用编写TCC中的三个阶段,实现简单

缺点:

  • 软状态持续时间不确定,时效性差
  • 没有锁,没有事务隔离,会有脏写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/537476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

品牌发言稿怎么写?媒介盒子分享

品牌发言稿的重要性不言而喻,它不仅代表着品牌形象,更是沟通品牌与消费者、合作伙伴的桥梁。如何撰写一篇高质量的品牌发言稿,成为许多品牌关注的焦点。今天媒介盒子来和大家聊聊:品牌发言稿怎么写。 一、 发言稿写作技巧 1.结构…

MQTT的学习

近期构建物联网平台,学习到MQTT,这里使用的是uniapp作为连接MQTT broker的,这里使用的是国产的EMQX。 MQTT的认识 MQTT 协议入门:基础知识和快速教程 | EMQ(简单的认识) 创建 MQTT 连接时如何设置参数&am…

UI自动化测试案例

备注:本文为博主原创文章,未经博主允许禁止转载。如有问题,欢迎指正。 个人笔记(整理不易,有帮助,收藏+点赞+评论,爱你们!!!你的支持是我写作的动力) 笔记目录:笔记本~笔记目录_airtest和selenium那个好用-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪…

如何应对app应用程序或者网站常见的几种攻击类型

大家好,我是咕噜铁蛋!今天,我想和大家聊聊一个我们日常生活中经常遇到的问题——如何应对app或者网站常见的几种攻击类型。随着互联网的普及,app和网站已经成为我们获取信息、交流互动的重要平台。然而,这些平台也时常…

Vue.js组件精讲 第2章 基础:Vue.js组件的三个API:prop、event、slot

如果您已经对 Vue.js 组件的基础用法了如指掌,可以跳过本小节,不过当做复习稍读一下也无妨。 组件的构成 一个再复杂的组件,都是由三部分组成的:prop、event、slot,它们构成了 Vue.js 组件的 API。如果你开发的是一个…

360AI搜索爆火,位居三月全球AI新品增速榜榜首

近日,独立AI产品榜单“AI产品榜(aicpb.com)”发布最新全球AI新品增速榜单,该榜单数据显示,360AI搜索位居三月新品增速榜榜首,3月访问量环比增加1798.76%。360集团另一款AI产品360苏打办公也同时上榜&#x…

【2024年认证杯】A题详细思路+数据(来源)+成品论文+模型代码(matlab+python)

2024年认证杯A题 解题思路 ⭐⭐第一问题分析第二问题分析第三问题分析 数据与数据来源🎉🎉指标解释数据来源 成品参考论文😊😊python/ matlab 代码🚀🚀 解题思路 ⭐⭐ 这个题目要求我们围绕人造保暖纤维的…

Excel表格中的10000元变成1万元

程序代码园发文地址:Excel表格中的10000元变成1万元-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,Excel表格中的10000元变成1万元http://www.byqws.com/blog/3149.html?sourcecsdn 今天早上有同事问我,在Excel表格里面怎么…

Vue项目中,使用高级表格vxe-table中的【vxe-grid】动态列之动态插槽

1、首先项目当中得安装了vxe-table // 没有安装的话,可以使用一下命令安装 npm install vxe-table 或 yarn add vxe-table使用示例: import Vue from vue import VXETable from vxe-table import vxe-table/lib/style.cssVue.use(VXETable)2、动态列中动…

直播预告:告诉你最真实的网优行业内幕!

很多小伙伴在后台私信小编,说想学网优但是从来没接触过这一行,或者是接触过但是了解不多,零基础真的可以学吗?免费试学时间是多久?学完后有多少薪资?上课的方式是什么?需不需要出差?…

MySQL高可用搭建方案MHA

MHA架构介绍 MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中&am…

Python实现BOA蝴蝶优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

React之基础项目搭建

前言 React的生态系统非常庞大,拥有大量的第三方库和工具,如React Native(用于构建原生移动应用)、Next.js(用于构建服务器渲染应用)、Create React App(用于快速搭建React应用的脚手架&#x…

【Linux】网络编程套接字二

网络编程套接字二 1.TCP网络编程1.1TCP Server服务端1.2 TCP Client客户端 2.Server 多进程版本2.1普通版2.2 信号版 3.Server 多线程版4.Server 线程池版5.日志函数重新设计6.守护进程7.TCP协议通讯流程8.TCP和UDP 对比 喜欢的点赞,收藏,关注一下把&…

蓝桥杯真题Day48 倒计时5天 练了几道真题小程序+回溯剪枝应用一个小程序

[蓝桥杯 2023 省 A] 更小的数 题目描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串,下标从0到 n−1,你可以将其视作是一个具有n位的十进制数字num,小蓝可以从num 中选出一段连续的子串并将子串进行反转,最多反转一次…

C#基础--之数据类型

C#基础–之数据类型 在第一章我们了解了C#的输入、输出语句后,我这一节主要是介绍C#的基础知识,本节的内容也是后续章节的基础,好的开端等于成功的一半。在你阅读完本章后,你就有足够的C#知识编写简单的程序了。但还不能使用封装、…

基于PyAutoGUI图片定位的自动化截图工具--jmeter部分(2)

1、计划 压测完成后需要编写性能测试报告,报告中所需数据截图较多,使用自动化操作方便快捷,就编写一个界面工具以便后续复用。 基于PyAutoGUI图片定位的自动化截图工具–jmeter部分   使用pyautogui 库操作鼠标键盘,按钮根据截取…

汇舟问卷:做调查问卷需要准备什么?

大家好,我是汇舟问卷。海外问卷调查分为很多个种类,接触最多的有站点查、口子查和渠道查,每种调查的方式都是不一样的。 几年前口子查的操作门槛还是很低的,我们只需要在国外的社交网站上搜索调查问卷、调查这些类似的文字就能获…

MongoDB爬虫:(某扑)实战

https://bbs.hupu.com/bxj网页地址: https://bbs.hupu.com/bxj 然后我们在网页上定义帖子名称、帖子链接、创建时间、回复数、最后回复用户...... 除此之外,我们发现虎扑步行街最多显示的页数(20): 、 当我们打开第3页的时候,网页的URL的地址变为了:https://bbs.hupu.…

基于java+springboot+vue实现的西安旅游系统(文末源码+Lw)23-265

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统西安旅游系统信息管理难度大,容错率低&#…