分布式事务-Seata-详细图文讲解

news2024/11/14 21:18:20

目录

  • 分布式事务问题
    • 概述
    • 现象
  • Seata简介
  • 作用
    • 分布式事务处理过程
    • 处理过程
  • 使用
  • 安装
    • 下载
    • 解压+修改配置文件
    • 创建数据库
    • 创建数据表
    • 修改配置文件
    • 启动
  • 异常
    • 超时异常——没加@GlobalTransactional
      • 故障分析
    • 解决异常
  • 部分补充
    • 再看TC/TM/RM三大组件
    • 分布式事务的执行流程
    • AT模式如何做到对业务的无侵入
      • 前提
      • 整体机制
      • 一阶段加载
      • 二阶段提交
      • 二阶段回滚

分布式事务问题

概述

一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题

现象

单体应用被拆分成微服务应用,原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源,
业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题没法保证。
image.png

Seata简介

Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
官网:http://seata.io/zh-cn/

作用

分布式事务处理过程

一ID+三组件模型:
全局唯一事务ID:Transaction ID XID
三组件:

  • Transaction Coordinator (TC)
    • 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚;
  • Transaction Manager ™
    • 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议;
  • Resource Manager (RM)
    • 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚

处理过程

  1. TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID;
  2. XID 在微服务调用链路的上下文中传播;
  3. RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖;
  4. TM 向 TC 发起针对 XID 的全局提交或回滚决议;
  5. TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。

image.png
发布说明: https://github.com/seata/seata/releases

使用

image.png
本地:@Transactional
全局:@GlobalTransactional

安装

下载

https://github.com/seata/seata/releases

解压+修改配置文件

seata-server-0.9.0.zip解压到指定目录并
修改conf目录下的file.conf配置文件

  1. 先备份原始file.conf文件
  2. 主要修改:自定义事务组名称+事务日志存储模式为db+数据库连接信息
  3. file.conf
    1. service模块
    2. store模块
service {
 
  vgroup_mapping.my_test_tx_group = "fsp_tx_group"
 
  default.grouplist = "127.0.0.1:8091"
  enableDegrade = false
  disable = false
  max.commit.retry.timeout = "-1"
  max.rollback.retry.timeout = "-1"
}
 
## transaction log store
store {
  ## store mode: file、db
  mode = "db"
 
  ## file store
  file {
    dir = "sessionStore"
 
    # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
    max-branch-session-size = 16384
    # globe session size , if exceeded throws exceptions
    max-global-session-size = 512
    # file buffer size , if exceeded allocate new buffer
    file-write-buffer-cache-size = 16384
    # when recover batch read size
    session.reload.read_size = 100
    # async, sync
    flush-disk-mode = async
  }
 
  ## database store
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
    datasource = "dbcp"
    ## mysql/oracle/h2/oceanbase etc.
    db-type = "mysql"
    driver-class-name = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://127.0.0.1:3306/seata"
    user = "root"
    password = "你自己密码"
    min-conn = 1
    max-conn = 3
    global.table = "global_table"
    branch.table = "branch_table"
    lock-table = "lock_table"
    query-limit = 100
  }
}

创建数据库

mysql数据库中新建库Seata

创建数据表

位置:建表db_store.sql在\seata-server-0.9.0\seata\conf目录里面
db_store.sql

修改配置文件

修改seata-server-0.9.0\seata\conf目录下的registry.conf配置文件

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"
 
  nacos {
    serverAddr = "localhost:8848"
    namespace = ""
    cluster = "default"
  }
}

目的是:指明注册中心为nacos,及修改nacos连接信息

启动

先启动Nacos端口号8848
再启动seata-server

异常

超时异常——没加@GlobalTransactional

故障分析

当库存和账户金额扣减后,订单状态并没有设置为已经完成,没有从零改为1
而且由于feign的重试机制,账户余额还有可能被多次扣减

解决异常

添加@GlobalTransactional


@GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)
public void create(Order order)
{
    。。。。。。
}

下单后数据库数据并没有任何改变
记录都添加不进来

部分补充

  • 2019年1月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案
  • Simple Extensible Autonomous Transaction Architecture,简单可扩展自治事务框架
  • 2020起始,参加工作后用1.0以后的版本

再看TC/TM/RM三大组件

image.png
image.png

分布式事务的执行流程

  • TM 开启分布式事务(TM 向 TC 注册全局事务记录);
  • 按业务场景,编排数据库、服务等事务内资源(RM 向 TC 汇报资源准备状态 );
  • TM 结束分布式事务,事务一阶段结束(TM 通知 TC 提交/回滚分布式事务);
  • TC 汇总事务信息,决定分布式事务是提交还是回滚;
  • TC 通知所有 RM 提交/回滚 资源,事务二阶段结束。

AT模式如何做到对业务的无侵入

前提

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

整体机制

两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

一阶段加载

在一阶段,Seata 会拦截“业务 SQL”,
1 解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,
2 执行“业务 SQL”更新业务数据,在业务数据更新之后,
3 其保存成“after image”,最后生成行锁。
以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。
image.png

二阶段提交

二阶段如是顺利提交的话,
因为“业务 SQL”在一阶段已经提交至数据库,所以Seata框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可。
image.png

二阶段回滚

二阶段回滚:
二阶段如果是回滚的话,Seata 就需要回滚一阶段已经执行的“业务 SQL”,还原业务数据。
回滚方式便是用“before image”还原业务数据;但在还原前要首先要校验脏写,对比“数据库当前业务数据”和 “after image”,
如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理。
image.png

image.png

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

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

相关文章

【Cheat Engine7.5】基础教程第一关(STEP1-2)

Cheat Engine简称CE 一、CE STEP1-2练习 1、打开 2、简介 欢迎使用 Cheat Engine 训练教程 (3.4) 本教程将尝试讲解在游戏中作弊的一些基本知识. 并帮助你熟悉 Cheat Engine 的使用方法 (简称为CE). 请按下面的步骤开始. 1: 首先要打开Cheat Engine (如果你还没有运行它的话…

1078. Bigram 分词

1078. Bigram 分词 java代码&#xff1a; class Solution {public String[] findOcurrences(String text, String first, String second) {String[] arr text.split(" ");List<String> list new ArrayList<String>();for (int i 0; i < arr.lengt…

基于物联网云平台的分布式光伏监控系统的设计与实现

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;针对国内光伏发电监控系统的研究现状&#xff0c;文中提出了基于云平台的光伏发电监控体系。构建基于B/S架构的数据实时采集与推送&#xff0c;以SSH(strutsspringhibernate)作为Web开发框架&#xff0c;开发基…

维基百科是如何定义联合办公空间的?

联合办公是不同公司的员工共享办公空间的一种安排。它通过使用通用基础设施&#xff08;例如设备、公用设施、接待员和保管服务&#xff0c;以及在某些情况下的茶点和包裹接收服务&#xff09;来节省成本和提供便利。它对独立承包商、独立科学家、远程工作者、数字游民和经常旅…

跨项目配置,nacos的动态更新配置,如何才能生效

在SpringCloud项目中&#xff0c;有时会出现多个项目读取同一配置的场景&#xff0c;那么这种跨项目的动态更新配置&#xff0c;如何才能生效。 方案1.使用refreshable-dataids 如果配置文件是使用如下方式获取配置&#xff0c;只需要使用refreshable-dataids 在Nacos中&am…

startActivityForResult()方法被弃用

一、现象 在新版androidX里面&#xff0c;startActivityForResult()被标注弃用&#xff0c;推荐使用registerForActivityResult()方法 二、解决方案 &#xff1a; 使用registerForActivityResult()方法 但是注意了&#xff1a; 1、registerForActivityResult只能在onCreate()…

中兴通讯-000063 三季报分析(20231024)

中兴通讯-000063 基本情况 公司名称&#xff1a;中兴通讯股份有限公司 A股简称&#xff1a;中兴通讯 成立日期&#xff1a;1997-11-11 上市日期&#xff1a;1997-11-18 所属行业&#xff1a;计算机、通信和其他电子设备制造业 主营业务&#xff1a;信息产业、通讯及电子设备、计…

Django分页功能的使用和自定义分装

1. 在settings中进行注册 # drf配置 REST_FRAMEWORK {DEFAULT_AUTHENTICATION_CLASSES: (# rest_framework_jwt.authentication.JSONWebTokenAuthentication,rest_framework_simplejwt.authentication.JWTAuthentication,rest_framework.authentication.SessionAuthenticatio…

java对接homeassistant实现远程控制(配置frp实现内网穿透)

Home Assistant API文档 https://dev-docs.home-assistant.io/en/master/ 这里是设备的基本前缀 以下是Home Assistant的全部设备前缀及代表的设备类型&#xff1a;1. air_quality&#xff1a;空气质量监测器设备&#xff1b; 2. alarm_control_panel&#xff1a;报警面板设…

科普丨语音芯片的宽电压设计作用

语音芯片的宽电压设计具有以下几个作用&#xff1a; 1. 适用范围广&#xff0c;适应性强。宽电压设计使语音芯片能够在不同电压范围内工作&#xff0c;从而适应电源供电系统的不稳定性。无论是在低电压还是高电压情况下&#xff0c;宽电压设计可以确保语音芯片正常工作&#x…

内存泄漏问题,4种智能指针(介绍+模拟实现)

目录 内存泄漏 介绍 分类 堆内存泄漏 系统资源泄漏 检测内存泄漏的方式 智能指针 引入 介绍 原理 引入 RAII原则 指针性质 拷贝 auto_ptr 介绍 代码 boost库 unique_ptr 介绍 代码 shared_ptr 介绍 删除器 代码 问题(循环引用) weak_ptr 介…

Visual Studio 2019部署桌面exe(笔记)

一、使用Visual Studio自带的Publish功能 上述两张图片一般会自动加载&#xff0c;只需要查看一下即可。 签名问题&#xff1a; 生成exe执行文件 双击setup.exe 桌面生成&#xff08;默认图标&#xff09; 换图标&#xff1a; 对应桌面生成的exe

10个免费的logo设计神器

logo是标志或商标的英文声明&#xff0c;是指企业为自己设计logo的行为。随着技术的发展&#xff0c;许多logo设计在线生成器已经在互联网上诞生&#xff0c;供您使用和参考。通过图像logo设计&#xff0c;消费者可以记住公司的业务或品牌文化&#xff0c;并发挥识别和推广的作…

最新校园说明会日程安排-ABeam(德硕)旗下艾宾信息技术开发(上海) 德硕管理咨询(深圳)

艾宾信息技术开发&#xff08;上海&#xff09; 2024校园招聘 招聘岗位 公司介绍 福利待遇 联系我们 行程一览 华东理工大学校园宣讲会 日期&#xff1a;2023年10月23日&#xff08;周一&#xff09; 时间&#xff1a;14:00-16:00 地点&#xff1a;上海市徐汇区梅陇…

语雀崩了,免费送VIP6个月,赶紧薅!!

一、前言 在一个无聊的周一&#xff0c;下午浑浑噩噩的时候&#xff0c;一条公众号信息引起我的关注。 什么东西&#xff1f;语雀这种量级的产品也能崩&#xff1f; 看了一下还真是官方公众号发的&#xff01;&#xff01; 心里不由得出现&#xff0c;完蛋整个团队要打包遣…

Python武器库开发-面向对象篇(五)

面向对象篇(五) 面向对象编程 是最有效的软件编写方法之一。在面向对象编程中&#xff0c;你编写表示现实世界中的事物和情景的类&#xff0c;并基于这些类来创建对象。编写类时&#xff0c;你定义一大类对象都有的通用行为。基于类创建对象 时&#xff0c;每个对象都自动具备…

Android Studio 查看Framework源码

1、背景 安卓系统源码量很庞大&#xff0c;选择好的开发工具和方式去开发可以提升开发效率&#xff0c;常用的开发工具有Source Insight 、Visual Studio Code、Android Studio&#xff0c;vscode适合C和C代码开发&#xff0c;java层代码无法跳转和提示&#xff0c;因此&#…

Java——关于实现多线程的测试小题,帮助我们更好的理解多线程的使用方法

前面讲解了关于多线程的使用方法&#xff0c;这篇文章则是进行实战&#xff0c;做几道测试题。 感兴趣的情况下可以看一下Java多线程 多线程练习1 (卖电影票) 一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒要求:请用多线程模拟卖票过程并打印剩余电影…

37 深度学习(一):查看自己显卡的指令|张量|验证集|分类问题|回归问题

文章目录 查看自己显卡的指令框架选什么张量的阶数验证集存在的意义分类问题一般的全连接的代码格式&#xff08;板子&#xff09;上面训练的详解一些省略梯度消失和梯度爆炸Dropout 回归问题一般回归的全连接的板子 batch-size超参数搜索策略 此系列的深度学习主要是理论性的介…

Linux docker 安装 部署

docker 安装 linux系统离线安装docker 如何使用docker部署c/c程序 常用命令 给予 docker 访问 gui 的权限 在 /etc/profile 末尾添加 if [ "$DISPLAY" ! "" ] thenxhost fi在执行 更新 source /etc/profiledocker下载镜像 docker search gcc #搜索d…