iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java分布式事务管理框架之Seata
  • 404
分享到

Java分布式事务管理框架之Seata

2024-04-02 19:04:59 404人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录Seata介绍三大组件实现原理四种事务模式搭建seata服务端单机版安装集群安装Seata介绍 Seata:Simple Extensible Autonomous Transa

Seata介绍

Seata:Simple Extensible Autonomous Transaction Architecture,简易可扩展的自治式分布式事务管理框架,其前身是fescar。是一种简单分布式事务的解决方案。Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

官方文档:https://seata.io/zh-cn/docs/overview/what-is-seata.html

三大组件

事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚,相当于是协调者。

事务管理器(TM):定义全局事务的范围:开始全局事务,提交或回滚全局事务,相当于LCN中发起方。

资源管理器(RM):管理分支事务正在处理的资源,与TC进行对话以注册分支事务并报告分支事务的状态,并驱动分支事务的提交或回滚,相当于是LCN中的参与方

实现原理

  • 发起方™和我们的参与方(RM)项目启动之后和协调者TC保持长连接;
  • 发起方™调用接口之前向TC获取一个全局的事务的id 为xid,注册到 seata 中.aop实现
  • 使用feign客户端调用接口的时候,seata重写了feign客户端,在请求中传递该xid。
  • 参与方(RM)从请求头中获取到该xid,方法执行完后不会立马提交而是等待协调者告诉提交状态。

四种事务模式

第一种、AT

使用这种模式有个前提:

  • 基于支持本地 ACID 事务的关系型数据库
  • Java 应用,通过 JDBC 访问数据库

实现过程分为两个阶段:

一阶段:

在一阶段中,Seata会拦截“业务sql“,首先解析SQL语义,找到要更新的业务数据,在数据被更新前,保存下来"undo",然后执行”业务SQL“更新数据,更新之后再次保存数据”redo“,最后生成行,这些操作都在本地数据库事务内完成,这样保证了一阶段的原子性。

  • 解析 SQL:得到 SQL 的类型(UPDATE),表(product),条件(where name = ‘TXC’)等相关的信息。
  • 查询前镜像:根据解析得到的条件信息,生成查询语句,定位数据。
  • 执行业务 SQL:更新这条记录的 name 为 ‘GTS’。
  • 查询后镜像:根据前镜像的结果,通过 主键 定位数据。
  • 插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 UNDO_LOG 表中。
  • 提交前,向 TC 注册分支:申请 product 表中,主键值等于 1 的记录的 全局锁 。
  • 本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交。
  • 将本地事务提交的结果上报给 TC。

二阶段:

相对一阶段,二阶段比较简单,负责整体的回滚和提交,如果之前的一阶段中有本地事务没有通过,那么就执行全局回滚,否在执行全局提交,回滚用到的就是一阶段记录的"undo Log",通过回滚记录生成反向更新SQL并执行,以完成分支的回滚。当然事务完成后会释放所有资源和删除所有日志。

事务回滚的情况

  • 收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。
  • 通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。
  • 数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理
  • 根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句
  • 提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。

事务提交的情况

  • 收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。
  • 异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。

**总结:**AT模式是一种无侵入的分布式事务解决方案,在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。该模式会根据用户执行的SQL生成对应的回滚数据的SQL语句,然后根据事务的提交还是回滚来执行回滚的SQL语句还是删除对应的UNDO LOG 记录(SQL语句)。

第二种、TCC

不依赖于底层数据资源的事务支持:是指支持把 自定义 的分支事务纳入到全局事务的管理中。

一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
二阶段 commit 行为:调用 自定义 的 commit 逻辑。
二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。

第三种、Saga

Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

第四种、XA

在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种事务模式。

使用前提:支持XA 事务的数据库。Java 应用,通过 JDBC 访问数据库。

这里主要介绍使用AT模式,后续提供每种模式的实现方式、代码案例。

搭建seata服务端

单机版安装

下载地址:Https://GitHub.com/seata/seata/releases

这里使用的是1.4.2版本

学习测试建议使用单机版,简单搭建,生成环境不建议。

直接在github上下载对应的软件包,一键启动即可,默认是file模式,也就是数据以文件的形式保存本地。

解压之后,进入bin目录执行对应的启动命令即可:windows环境执行 bat文件,linux环境执行 sh文件。

启动成功:

数据保存在本地

集群安装

首先准备MysqlNacos环境,在准备至少两台服务器,这里数据存到mysql中去。

多个 Seata TC Server 通过 db 数据库,实现全局事务会话信息的共享。同时,每个 Seata TC Server 可以注册自己到注册中心上,方便应用从注册中心获得到他们。

初始化SQL语句(可以去github中找到,源码中也有),seata框架需要用的数据库表

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`               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 = utf8;
-- 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),
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

每个seata服务节点的配置信息修改:主要修改下面两个文件

file.conf文件的修改:注意mysql 的版本,我这里使用的是MySQL8

store {
  ## store mode: file、db、Redis
  mode = "db"
  ## rsa decryption public key
  publicKey = ""
  ## database store property
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
    datasource = "druid"
    ## mysql/oracle/postgresql/h2/oceanbase etc.
    dbType = "mysql"
    driverClassName = "com.mysql.cj.jdbc.Driver"
    ## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
    url = "jdbc:mysql://www.kaicostudy.com:3306/transaction_seata?rewriteBatchedStatements=true"
    user = "root"
    passWord = "123456"
    minConn = 5
    maxConn = 100
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}

reGIStry.conf 文件的修改:

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    application = "seata-server"
    serverAddr = "www.kaicostudy.com:8848"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    username = ""
    password = ""
  }
}

config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
    serverAddr = "www.kaicostudy.com:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = ""
    password = ""
    dataId = "seataServer.properties"
  }
}

修改好每个seata服务节点的配置信息后,正常一次启动seata服务就可以了。之后可以在nacos看到seata服务的信息。

到此这篇关于Java分布式事务管理框架之Seata的文章就介绍到这了,更多相关Java Seata内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java分布式事务管理框架之Seata

本文链接: https://www.lsjlt.com/news/165586.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java分布式事务管理框架之Seata
    目录Seata介绍三大组件实现原理四种事务模式搭建seata服务端单机版安装集群安装Seata介绍 Seata:Simple Extensible Autonomous Transa...
    99+
    2022-11-13
  • Java详细分析LCN框架分布式事务
    目录2PC两阶段提交协议LCNLCN基本实现原理搭建全局协调者使用LCN解决分布式事务问题源码分析2PC两阶段提交协议 分布式事务通常采用2PC协议,全称Two Phase Comm...
    99+
    2022-11-13
  • 分布式事务使用Seata的AT事务模式如何理解
    分布式事务使用Seata的AT事务模式如何理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。项目使用了微服务,并且将一些模块进行了拆分,现在遇到了一个批量保存的场景,而且还...
    99+
    2023-06-19
  • SpringCloud Alibaba使用Seata处理分布式事务的技巧
    Seata简介 在传统的单体项目中,我们使用@Transactional注解就能实现基本的ACID事务了。 但是前提是: 1) 数据库支持事务(如:MySQL的innoDB引擎) 2...
    99+
    2022-11-12
  • 详谈Spring框架之事务管理
    一、编程式事务二、声明式事务1、基于XML的事务1.1 Spring配置文件 <!-- 配置c3p0数据源,只是进行了最简单的配置 --> <bean id="dataSource" class="com.mchange...
    99+
    2023-05-31
    spring 框架 事务管理
  • tcc分布式事务框架体系解析
    目录前言碎语以电商下单为例订单服务:库存服务:支付服务:hmily事务框架怎么做的?实现HmilyTransactionInterceptor接口dubbo的aspect抽象实现du...
    99+
    2022-11-13
  • Java分布式服务框架Dubbo介绍
    目录1、什么是Dubbo?2、Dubbo核心组件是?3、Dubbo的工作原理是?4、介绍一下Dubbo框架分层?5、Dubbo支持哪些协议?1.dubbo默认协议:2.rmi协议:3...
    99+
    2022-11-13
  • 如何理解Java分布式事务
    今天小编给大家分享一下如何理解Java分布式事务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2022-10-19
  • 如何进行分布式事务框架GTS全解析
    今天就跟大家聊聊有关如何进行分布式事务框架GTS全解析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。全局事务服务(Global Transaction Service,简称 GTS)...
    99+
    2023-06-04
  • java开发分布式服务框架Dubbo原理机制详解
    目录前言Dubbo框架有以下部件ConsumerProviderRegistryMonitorContainer架构高可用性框架设计服务暴露过程服务消费过程前言 在介绍Dubbo之前...
    99+
    2022-11-12
  • java开发分布式服务框架Dubbo原理机制的示例分析
    这篇文章给大家分享的是有关java开发分布式服务框架Dubbo原理机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言在介绍Dubbo之前先了解一下基本概念:Dubbo是一个RPC框架,RPC,即Re...
    99+
    2023-06-25
  • java开发分布式服务框架Dubbo调用过程
    目录大致流程调用请求的具体信息协议Dubbo协议序列化器调用流程图调用流程源码分析——客户端模板方法模式路由和负载均衡调用的三种方式调用流程源码分析——服务端总结大致流程 客户端根据...
    99+
    2022-11-12
  • 如何利用Redis实现分布式事务管理
    如何利用Redis实现分布式事务管理引言:随着互联网的快速发展,分布式系统的使用越来越广泛。在分布式系统中,事务管理是一项重要的挑战。传统的事务管理方式在分布式系统中难以实现,并且效率低下。而利用Redis的特性,我们可以轻松地实现分布式事...
    99+
    2023-11-07
    管理 redis 分布式事务
  • Java中TCC分布式事务的实现原理
    这篇文章给大家分享的是有关Java中TCC分布式事务的实现原理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理...
    99+
    2023-06-14
  • 详解Java TCC分布式事务实现原理
    目录概述业务场景介绍进一步思考落地实现 TCC 分布式事务TCC 实现阶段一:TryTCC 实现阶段二:ConfirmTCC 实现阶段三:Cancel总结与思考最终一致性分布式事务如...
    99+
    2022-11-12
  • Java分布式架构如何应用于Laravel路径管理?
    Java分布式架构和Laravel路径管理是两个不同的领域,但是它们可以结合起来实现更加高效的开发和管理。在本文中,我们将介绍如何将Java分布式架构应用于Laravel路径管理。 首先,让我们来看一下Java分布式架构是什么。Java分布...
    99+
    2023-08-25
    分布式 laravel path
  • java开发分布式服务框架Dubbo暴露服务的示例分析
    小编给大家分享一下java开发分布式服务框架Dubbo暴露服务的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Dubbo服务暴露机制前言在进行服务暴露机制的分析之前,必须谈谈什么是URL,在Dubbo服务暴露过程中...
    99+
    2023-06-25
  • 基于TCC如何实现一个通用的分布式事务框架
    这篇文章给大家介绍基于TCC如何实现一个通用的分布式事务框架,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一个TCC事务框架需要解决的当然是分布式事务的管理。TCC事务模型虽然说起来简单,然而要基于TCC实现一个通用的...
    99+
    2023-06-16
  • 如何在 ASP 框架中实现高效的分布式路径管理?
    在ASP框架中实现高效的分布式路径管理,是许多Web应用程序开发人员必须面对的问题。为了解决这个问题,我们需要一个可靠的方案,使应用程序可以快速地响应客户端的请求。本文将介绍如何在ASP框架中实现高效的分布式路径管理,并提供相关演示代码供参...
    99+
    2023-10-19
    框架 path 分布式
  • 在分布式系统中如何使用ASP框架来管理NumPy计算任务?
    随着数据量的不断增加,单机计算已经无法满足大规模数据处理和分析的需求。因此,分布式计算成为了当前热门的研究方向。ASP(Asynchronous Spread Programming)是一种基于消息传递的分布式计算框架,可以实现高效、可扩...
    99+
    2023-09-24
    numpy 分布式 unix
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作