Seata的使用

news2024/11/15 22:00:42

Seata

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。

术语

  1. TC(Transaction Coordinator) -事务协调者(相当于服务端)

    1. 维护全局和分支事务的状态,驱动全局事务提交或回滚

  2. TM(Transaction Manager) - 事务管理器(相当于应用,相当于各模块)

    1. 定义全局事务的范围:开始全局事务,提交或回滚全局事务

  3. RM(Resource Manager) - 资源管理器(数据库)

    1. 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

seata分布式事务原理

以官方示例为例,

老项目正常流程:当我们采用分布式部署时,Order下单后,Account账户中扣除数据完成后,再调用Storage库存减一。

但是现在数据库分开,那么Order完成后就直接完成数据库的修改,接着到Account中扣除金额完成,返回到business中,调用storage减除库存时发现库存不足,但是前两步已经提交了。

如果不做分布式事务的话我们就要重新提供接口,在进行反向的操作,例如Account中需要将金额加上。

问题:调度事情就很多,补偿很多,以及还有可能补偿失败。

  • 这里就交给Seata来做,我们来写补偿。由seata来具体操作,这就是Seata的TCC模式。

  • 补偿也不由我们来写,由Seata自动分析来进行,比如update金额减少之后,发现需要重新操作,这是Seata就会自动生产sql,update金额加回来。这就是Seata中的AT模式

分布式事务的四种模式

  • AT模式:默认,简单,需要增加undo_log表,生产反向SQL,性能高。回滚后,原来没数据的,现在还是没数据

  • TCC模式:try confirm/cancel ,三个阶段代码都得自己实现,Seata只负责调度。对业务代码入侵性较强,必要时可能还要修改数据库(因为try并非真正的去扣减,而是做一个冻结的操作,比如100:有我们需要扣减一,就会冻结一个,接着在confirm中解冻,真正去扣减)

  • SAGA模式,长事务解决方案,需要程序员自己编写两阶段代码(AT模式不需要写第二阶段)

    • 基于状态机实现,需要一个JSON文件,可异步执行

  • XA模式,XA协议是由X/Open组织提出的分布式事务处理规范,基于数据库的XA协议来实现2PC又称为XA方案,适用于强一致性的场景,比如金融、银行

Seata应用 :

选中座位后事务处理,座位表修改售卖情况sell(b库),余票详情表修改余票(b库),为会员增加购票记录(会员端的接口),更新确定订单为成功(b库)

  1. 引入依赖:

  2. 需要使用分布式事务的都增加undo表。

  3. 配置每个模块

  4. 开启分布式事务,@GlobalTransactional

注:统一异常处理:

需要判断是否为全局事务。如果不加这段member出现异常时,虽然commonResp.success=false但是接口返回码是200,business会认为调用是成功的。

配置中心

seata有自己的配置中心,需要重新配置,而springcloud中的配置仅仅作用于项目。注册中心同理。

修改配置中心与注册中心:在conf目录下的application.yml中参照application.example.yml进行配置

从配置中心中配置文件

与自己设置保持一致

配置好数据库,以及基本的表,可在script/server/db下找到mysql.sql执行。

注:AT模式会有一个全局锁,用来防止脏读,线程1的事务修改了库存,但是还没有提交事务,线程二读库存读的还是原来的库存。

在配置中心定义所有的项目所属的集群,当集群挂了可以快速换成另一个集群。

sql限制:

Seata 事务目前支持 INSERT、UPDATE、DELETE 三类 DML 语法的部分功能,这些类型都是已经经过Seata开源社区的验证。SQL 的支持范围还在不断扩大,建议在本文限制的范围内使用。如果您有意帮助社区支持更多类型的SQL,请提交PR申请。

  • 不支持 SQL 嵌套

  • 不支持多表复杂 SQL(自1.6.0版本,MySQL支持UPDATE JOIN语句,详情请看 )

  • 不支持存储过程、触发器

  • 部分数据库不支持批量更新,在使用 MySQL、Mariadb、PostgreSQL9.6+作为数据库时支持批量,批量更新方式如下以 Java 为例

 // use JdbcTemplate
    public void batchUpdate() {
        jdbcTemplate.batchUpdate(
            "update storage_tbl set count = count -1 where id = 1",
            "update storage_tbl set count = count -1 where id = 2"
        );
    }
​
•    // use Statement
•    public void batchUpdateTwo() {
•        statement.addBatch("update storage_tbl set count = count -1 where id = 1");
•        statement.addBatch("update storage_tbl set count = count -1 where id = 2");
•        statement.executeBatch();
•    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Python实现Excel文件首页截图工具

日常工作中,尤其是处理大量Excel文件时,可能需要对文件的首页进行截图保存,以便于后续的快速查看或报告编写。今天,我将分享一个用Python编写的Excel文件首页截图工具。这个工具将帮助我们自动化地对选定的Excel文件进行首页截图&…

Linux驱动入门—什么是驱动?体系结构,驱动的分类,开发驱动需要注意的问题

文章目录 什么是驱动?Linux系统体系结构用户空间与内核空间的隔离用户应用程序库函数用户空间守护进程命令行接口(CLI)图形用户界面(GUI) 内核空间内核的角色和职责内核空间与用户空间的区别内核的结构和组成内核空间的…

【Linux】网络架构探秘:网络层功能、IP协议详解及路由过程指南

文章目录 前言:1. 网络层是干什么的?2. IP协议2.1 理论铺垫2.2 IP协议的头格式2.3 网段划分(重点)2.3.1 分类划分法:2.3.2 子网掩码:2.3.3 为什么要经行子网划分? 2.4 特殊的IP地址2.5 IP地址的数量限制2.…

个人量化交易兴起!有什么好用的量化软件推荐?迅投QMT量化平台简介!

QMT是专门为机构、活跃投资者、高净值客户等专业投资者研发的智能量化交易终端,拥有高速行情、极速交易、策略交易、多维度风控等专业功能,满足专业投资者的特殊交易需求。覆盖业务范围广:沪深A股、港股通、两融、期权、期货。 适合用QMT的投资者&#x…

用Java手写jvm之模拟解释器执行指令码

写在前面 本文看下如何模拟解释器执行指令码。需要一些前置内容: 用Java手写jvm之系列 中的前4篇文章,当然如果你已经了解了这部分内容,也可以不看。 1:正文 既然是模拟解释器,我们肯定要先来定义一个解释器类了&am…

一个灵活、可扩展的开源问答平台,可用于社区论坛、帮助中心、知识管理等多种场景

大家好,今天给大家分享的是一个开源的问答平台软件Apache Incubator-Answer,由 SegmentFault 思否团队于 2022 年 10 月 24 日正式开源,并于同年入选 Apache 软件基金会孵化器。 项目介绍 Apache Incubator-Answer旨在为任何规模的团队提供一…

【C语言版】数据结构教程(一)绪论(上)

【内容简介】本文整理数据结构(C语言版)相关内容的复习笔记,供各位朋友借鉴学习。本章内容更偏于记忆和理解,请读者们耐心阅读。 数据结构教程 绪论(上) 本节学习目标 1.1 基本概念 1.2 抽象数据类型的表示…

苹果电脑怎么录制屏幕?3招教你轻松录制,高效实用

随着数字化时代的快速发展,屏幕录制已经成为我们日常工作和生活中不可或缺的一部分。它不仅是展示产品、教授知识、分享经验的重要工具,更是我们展现个性和创造力的新舞台。在苹果电脑上,屏幕录制功能的应用更是将这一体验推向了新的高度。 …

优思学院|不良产品留到客户产线上了,8D报告要如何写?

8D问题解决法是一个经常用作公司内部改善以及应付客户投诉的关键方法,不过,在改善的过程中却有一些误区,如果没有注意,那么这份8D报告将会变得徒劳无功。这里有一个这样的案例: 一个经验丰富的工程师把客户图纸看错了&…

【面向PM考试】挣值分析的计算场景介绍

前言 PM考试目前还是挺火热的,有些人是因为行业所需,有些人是因为自身学习,总而言之,需要经过系统的学习,才能胜任当下的工作。 关于挣值分析,包括一些基础概念,博主有一篇文章已详细介绍&…

基于ip/域名/端口的server配置、nodej项目、部署nfs服务器

回顾复习 jdk环境 tomcat服务器需要jdk环境 版本对应 tomcat>jdk17 tomcat9>jdk1.8 tomvat10>jdk17 1、配置系统变量 JAVA_HOME sed -i $aexport JAVA_HOME/usr/local/jdk22/ /etc/profile sed -i $aexport PATH$JAVA_HOME/bin:$PATH /etc/profile sour…

猫用空气净化器应该如何挑选?国内养猫空气净化器哪个好?

有没有友友跟我一样是鼻炎患者,可偏偏家里两只猫都是掉毛怪,行走的大型蒲公英,多猫家庭确实很快乐,但一到换毛季,家里地上、空气里全是猫毛。每天都需要拼命的吸地板(累鼠个人),毛一…

金牌九宫格!经常跑步的人,没有一个是弱者——早读(逆天打工人爬取热门微信文章解读)

我在学习龙头战法,有了解的吗? 引言Python 代码第一篇 洞见 经常跑步的人,没有一个是弱者第二篇 今天尝试结尾 引言 时间是什么? 我越来越觉得是一个限定 因为没有时间 我们很多事情就有点乱套 你说你的 我说我的 十分混乱 没有一…

Matplotlib面积图绘制秘籍:让你的数据‘膨胀’起来,但不吹泡泡哦!

1. 引言 嘿,数据迷们!想不想让你的数据‘活’起来,跳一曲色彩斑斓的面积舞?Matplotlib面积图,不只是数字的堆砌,它是故事的讲述者,让复杂数据变得一目了然,还带点小幽默。快来一探究…

第1天:Python基础语法(五)

正文: 在之前的文章中,我们已经学习了Python的基本语法集合和集合的一些常用操作。 在本篇文章中,我们将继续学习其他类型 字符串格式化 使用操作符%s来实现 ➢ 几个%s就几个变量 ➢ 超过一个变量时,需要用元组%(…

SpringBoot SseEmitter,服务器单项消息推送

防止推送消息乱码 import org.jetbrains.annotations.NotNull; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.servlet.mvc.method…

阿里云实时计算Flink在多行业的应用和实践

摘要:本文整理自 Flink Forward Asia 2023 中闭门会的分享。主要分享实时计算在各行业的应用实践,对回归实时计算的重点场景进行介绍以及企业如何使用实时计算技术,并且提供一些在技术架构上的参考建议。内容分为以下四个部分: 业…

Magic-PDF:端到端PDF文档解析神器 构建高质量RAG必备!

项目结构 流程解析 预处理的作用是判断文档内容是否需要进行OCR识别,如果是普通可编辑的PDF文档,则使用PyMuPDF库提取元信息。 模型层除了常规的OCR、版面结构分析外,还有公式检测模型,可提取公式内容,用于后续把公式…

Ubuntu系统在两个屏幕上都显示任务栏

Ubuntu系统在两个屏幕上都显示任务栏 目标 希望在两个屏幕(主屏和扩展屏)上都显示下图的状态栏 解决方法 打开设置,找到>外观>Dock 2. 将显示于改成所有显示

明清进士人数数据

明清进士人数数据 指标:省份名称、城市名称、区县名称、明清各省进士人数、明清各城市进士人数、明清各县区进士人数 指标说明: Province[省份名称]-统计数据所属省份 City[城市名称]-统计数据所属地级市 Region[区县名称]-统计数据所属区县 MQpro…