分布式事务:解决方案之2PC实战

2023-10-28

说完《分布式事务:解决方案之2PC理论》,我们现在就要在理论的基础上实践一把。

1. 业务说明

下面我们通过Seata中间件实现分布式事务来模拟两个账户的转账交易过程。交易过程是:张三给李四转账指定金额。

2. 开发环境

  • 数据库:MySQL-5.6
  • 微服务框架:spring-boot-2.2.2.RELEASEspring-cloud-Hoxton.SR1spring-cloud-alibaba-2.1.0.RELEASE
  • Seata服务端(TC):1.1.0。(下载地址:https://github.com/seata/seata/releases

2.1 启动程序

源码地址:https://gitee.com/anbang713/distributed-transaction-study

启动程序之前,我们需要使用源码工程中对应的sql脚本创建相对应的数据库和表,以及插入测试数据。

(1)首先我们要启动registry-server服务注册中心;

(2)然后进入Seata服务端的bin文件夹,双击seata-server.bat文件启动;

(3)分别启动seata-demo-bank1seata-demo-bank2微服务。

3. 技术架构

在这里插入图片描述

交互流程如下:

(1)请求Bank1进行转账,传入转账金额。

http://localhost:9011/bank1/transfer?amount=xxx

(2)Bank1减少转账金额,通过feign调用Bank2,传入转账金额。

4. Seata执行流程

4.1 正常提交流程

在这里插入图片描述

4.2 回滚流程

回滚流程省略前的RM注册过程。

在这里插入图片描述

要点说明:

(1)每个RM使用DataSourceProxy连接数据库,其目的是使用ConnectionProxy,使用数据源和数据连接代理的目的就是在第一阶段将undo_log和业务数据放在一个本地事务提交,这样就保存了只要有业务操作就一定有
undo_log

(2)在第一阶段undo_log中存放了数据修改前和修改后的值,为事务回滚作好准备,所以第一阶段完成就已经将分支事务提交,也就释放了锁资源。

(3)TM开启全局事务开始,将XID全局事务id放在事务上下文中,通过feign调用也将XID传入下游分支事务,每个分支事务将自己的Branch ID分支事务ID与XID关联。

(4)第二阶段全局事务提交,TC会通知各个分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各个参与者只需要删除undo_log即可,并且可以异步执行,第二阶段很快可以完成。

(5)第二阶段全局事务回滚,TC会通知各个分支参与者回滚分支事务,通过 XID 和 Branch ID 找到相应的回滚日
志,通过回滚日志生成反向的 SQL 并执行,以完成分支事务回滚到之前的状态,如果回滚失败则会重试回滚操作。

5. 核心代码

5.1 bank1的业务层实现

@GlobalTransactional注解标注在全局事务发起的Service实现方法上,开启全局事务:GlobalTransactionalInterceptor会拦截@GlobalTransactional注解的方法,生成全局事务ID(XID),XID会在整个分布式事务中传递。在远程调用时,spring-cloud-alibaba-seata会拦截Feign调用将XID传递到下游服务。

@Transactional
@GlobalTransactional//开启全局事务
@Override
public void updateAccountBalance(String accountNo, Double amount) {
    log.info("bank1 service begin,XID:{}", RootContext.getXID());
    //扣减张三的金额
    accountInfoDao.updateAccountBalance(accountNo, amount * -1);
    //调用李四微服务,转账
    String transfer = bank2Client.transfer(amount);
    if ("fallback".equals(transfer)) {
        throw new RuntimeException("调用李四微服务异常");
    }
    if (amount == 2) {
        throw new RuntimeException("bank1 make exception..");
    }
}

5.2 bank2的业务层实现

@Transactional
@Override
public void updateAccountBalance(String accountNo, Double amount) {
    //李四增加金额
    accountInfoDao.updateAccountBalance(accountNo,amount);
    if(amount == 3) {
        //人为制造异常
        throw new RuntimeException("bank2 make exception..");
    }
}

6. 测试场景

(1)张三向李四转账成功

http://localhost:9011/bank1/transfer?amount=1

(2)李四事务失败,张三事务回滚成功

http://localhost:9011/bank1/transfer?amount=3

(3)张三事务失败,李四事务回滚成功

http://localhost:9011/bank1/transfer?amount=2
——End——
更多精彩分享,可扫码关注微信公众号哦。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式事务:解决方案之2PC实战 的相关文章

  • Seata整合nacos

    author zxw email 502513206 64 qq com 64 Jishou University 1 前言 之前一直使用的是seata 43 eureka的方式来使用 xff0c 最近自己在家的时候忽然想用nacos来试试
  • Seata(一) 服务配置以及启动

    文章目录 Seata 介绍Seata 简介Seata 演进历史Seata 设计理念Seata 的三大组件seata 实现的 2PC 与传统 2PC 的区别 Seata Server 安装Seata Server 下载Seata Server
  • springcloud通过nacos整合seata遇到的问题

    1 配置完成后 xff0c 启动seata server服务器 xff0c 注册到nacos xff0c 启动client后访问接口 xff0c 报错如下 xff1a io seata common exception FrameworkE
  • linux下如何设置开机自启(这里以seata服务为例)

    1 编写启动脚本 xff0c 大部分都是相同的 xff0c 但是有些程序可能略要修改 Unit Description 61 Seata Server After 61 network target Service User 61 root
  • Windows下seata报错为can not register RM,err:can not connect to services-server的解决办法,亲测有效。

    nacoc下的服务 xff1a 点开seata的TC服务看一下里面的地址 xff0c 左下角为你该服务的ip地址 上图我的ip地址是我目前在用的校园网地址也就是你的桌面右下角的网络地址 我之前报错的原因呢是因为他这里的默认的ip是我之前虚拟
  • Interview preparation -- spring cloud seata

    分布式事务 事物ACID特性 A Atomic 原子性 构成事物的所有操作 要么全部成功 要么全部失败 不存在部分成功或失败情况 C Conststency 一致性 在事物完成时候 所有数据必须保持一致 I Isolation 隔离性 并发
  • docker配置seata分布式事务并注册至nacos

    Docker配置分布式事务Seata并注册到Nacos服务中心 Docker常用基础命令 docker ps 查询当前服务器的服务 docker images 查看服务下载的镜像 docker ps a 查看所有的服务 包含未开启的服务 d
  • 微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务

    原文地址 http skaka me blog 2016 04 21 springcloud1 不同于单一架构应用 Monolith 分布式环境下 进行事务操作将变得困难 因为分布式环境通常会有多个数据源 只用本地数据库事务难以保证多个数据
  • 分布式事务的几种解决方案

    一 基础概念 1 什么是事务 事务可以看做是一次大的活动 它由不同的小活动组成 这些活动 要么全部成功 要么全部失败 2 本地事务 在计算机系统中 更多的是通过 关系型数据库来控制事务 这是利用数据库 本身的事务特性来实现的 因此叫 数据库
  • seata docker 连接nacos

    1 拉取镜像 docker pull seataio seata server 1 3 0 2 运行镜像 docker run name seata1 3 0 p 8091 8091 d seataio seata server 1 3 0
  • 【Seata】03 - Seata AT 模式全局锁相关知识简单整理

    文章目录 前言 参考目录 版本说明 分析整理 1 全局锁的引入说明 2 全局锁相关源码整理 2 1 流程简图 2 2 事务分支注册前的 SQL 相关操作 2 3 注册分支 获取全局锁 前言 上一篇文章介绍了 AT 模式的调用流程 但是有个比
  • 阿里开源一站式分布式事务框架seata源码分析(AT模式下TC分析)

    DefaultCoordinator1 seata Server分析 TC源码分析 在seata tc服务的启动的时候都是通过它提供的启动脚本来启动 对于seata Server的入口分析 也是启动脚本就可以看出 如下我截最后执行命令 才下
  • SpringCloudAlibaba - Seata (1) 各模式详解、微服务集成、集群搭建

    文章目录 分布式事务模型 Seata 架构 部署 TC 服务 微服务集成 Seata XA 模式 Seata 实现的 XA 模式 XA 模式的具体实践 AT 模式 AT 模式与 XA 模式最大的区别 AT 模式下的脏写问题 AT 模式的具体
  • seata1.3.0 系列学习(一、seata1.3.0 安装)

    下载seata 此处选用目前最新版本1 3 0 解压完成后 注 seata官方从1 0版本后不再提供sql脚本 以及nacos推送配置脚本 需要从0 9 0的版本复制 将红色框框的四个文件复制到1 3 0 conf目录下 执行db stor
  • seata server 1.6版本安装及配置

    文章目录 下载 安装并启动 数据库 导入数据库 修改配置文件 服务注册 配置中心 手动添加 脚本导入 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 Seata 是一款开源的分布式事务解决方
  • SpringCloud项目下使用分布式事务seata TCC模式与AT模式例子

    SpringCloud项目下使用分布式事务seata TCC模式与AT模式例子
  • 仅四步教你快速接入Seata分布式事务

    简介 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的分布式事务服务 Seata 将为用户提供了 AT TCC SAGA 和 XA 事务模式 为用户打造一站式的分布式解决方案 本篇文章将以视频与文字介绍的形式 指引你
  • 分布式事务的 N 种实现

    需求缘起 在微服务架构中 随着服务的逐步拆分 数据库私有已经成为共识 这也导致所面临的分布式事务问题成为微服务落地过程中一个非常难以逾越的障碍 但是目前尚没有一个完整通用的解决方案 其实不仅仅是在微服务架构中 随着用户访问量的逐渐上涨 数据
  • 事务,不只ACID

    1 什么是事务 应用在运行时可能会发生数据库 硬件的故障 应用与数据库的网络连接断开或多个客户端端并发修改数据导致预期之外的数据覆盖问题 为了提高应用的可靠性和数据的一致性 事务应运而生 从概念上讲 事务是应用程序将多个读写操作组合成一个逻
  • Seata源码分析——@GlobalTransactional

    Seata源码分析 GlobalTransactional 前言 脑图 Seata三大角色 GlobalTransactional 源码入口 GlobalTransactionScanner 初始化TM RM wrapIfNecessary

随机推荐

  • 容器化部署(prometheus+grafana)监控k8s集群

    prometheus images 下所有镜像导入到私有仓库 192 168 92 160 拷贝所有镜像到 master 的 images 目录下 root master images for i in gz do docker load
  • undefined reference to `vtable for’”问题的原因及解决方法

    在使用qt开发新项目时候 添加新的类是非常频繁的操作 有时候 手快 尤其程序员非常迷恋快捷键 doge 会不小心跳过一些关键步骤 导致出现一些问题 例如 undefined reference to vtable for 错误就很常见 QT
  • 获取百度搜索的返回结果

    基于request获取百度返回结果 本文基于request进行访问有可能导致SSLError 这有可能是由于本文是访问https所导致的 但这篇博客较完整地介绍了对html使用etree json对返回结果进行解析的操作 可以借鉴 Pyth
  • [Android studio] 第17节 Adapter适配器

    目录 一 Adapter是什么 二 Adapter详解 一 Adapter是什么 在 Android 开发中 适配器 Adapter 是一个关键的组件 用于将数据源绑定到界面上的视图组件 例如 ListView RecyclerView S
  • (转)自旋锁(spinlock) 解释得经典,透彻

    自旋锁与互斥锁有点类似 只是自旋锁不会引起调用者睡眠 如果自旋锁已经被别的执行单元保持 调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁 自旋 一词就是因此而得名 由于自旋锁使用者一般保持锁时间非常短 因此选择自旋而不是睡眠是非常必
  • docker容器启动报错

    启动容器报错 standard init linux go 178 exec user process caused no such file or directory 报错背景 我需要启动一个golang项目的容器 然后在我的centos
  • mysql中binlog 参数设置 启用binlog 清理binlog mysqlbinlog使用 mysqldump + mysqlbinlog用于数据备份和恢复 代码实现处理binlog

    文章目录 一 二进制日志格式 Binary Logging Formats 1 1 binlog介绍 1 2 启用binlog 1 3 binlog几十种配置说明 1 4 清理binlog日志 1 5 sql命令查看配置 二 mysqlbi
  • AI算力爆发,新职业出现,你发现了吗?

    AI算力 听起来高大上的名字它究竟是什么呢 人工智能 Artificial Intelligence 英文缩写为AI 人工智能 AI 是一种模拟人类智能的技术 它是利用计算机科学和相关技术研究 开发的一种智能型系统 人工智能技术在现代社会中
  • Flutter正在被悄悄放弃?浅析Flutter的未来

    在现如今快速迭代的开发大环境下 能够实现 一套代码 多端运行 是众多互联网开发团队的梦想 阿里 腾讯也都做过很多尝试 美团也一样 重点说说美团的开发团队 他们做了非常多跨平台开发框架的尝试 React Native PWA Weex 等等
  • elementUI+vue实现下拉选既能根据字典项查询下拉选项又能根据字典码查询下拉选项

    需求场景 elementUI vue实现下拉选既能根据字典项查询下拉选项又能根据字典码查询下拉选项 需求分析 一般是能满足查询字典项的需求就可以 我们通常会用elementUI自带的一个查询字典项的方法 也就是在elementUI框架中的
  • SpringMVC 详细教程及源码讲解

    目录 一 SpringMVC简介 1 什么是MVC 2 什么是SpringMVC 3 SpringMVC的特点 二 SpringMVC入门案列 1 开发环境 2 创建Maven工程 2 1 添加web模块 2 2 引入依赖 3 配置web
  • python学习 - copy模块的浅复制(copy)与深复制(deepcopy)

    python学习 copy模块的浅复制 copy 与深复制 deepcopy 简介 copy copy 详解 copy deepcopy 详解 简介 在使用列表或者字典进行传递参数的时候 可能会遇到函数改变了列表的值 但是不希望印象原来列表
  • C语言实现一元多项式加法运算

    说到一元多项式相加 相信很多小伙伴都不会陌生 甚至 合并同类项 已经要脱口而出了 因为上节课本人就是这样的哈哈 回到正题 一元多项式的加法运算 大概是这样的 知道怎么操作了之后就来看看如何储存一元多项式叭 很明显为了方便操作 而且每一项都含
  • CV 经典主干网络 (Backbone) 系列: CSPNet

    CSPNet 引言 1 模型介绍 2 CSPNet的优点 2 1 减少了模型的参数量和FLOPS数值 2 2 解决了梯度信息的重复问题 2 3 减少内存流量 3 融合策略 总结 引言 对于传统深度学习 总是想达到一个增加速度同时精度提高的效
  • 2022年Java秋招面试,程序员求职必看的ZooKeeper面试题

    前言 大公司面试特别喜欢问 Zookeeper 因为 Zookeeper 确实是足够的优秀 比如他的 Paxos 算法 Zab 协议 Leader 选举策略 分布式锁等都是大厂面试的高频考点 我们不仅需要熟悉使用 Zookeeper 更要了
  • 如何安装M26F1 5G路由器

    产品概述 M26F1 是一种物联网无线通信路由器 利用公用 3G 4G 5G 网络为用户提供无线长 距离大数据传输功能 该产品采用高性能的工业级 32 位通信处理器和工业级无线模块 以嵌入式实时操作系 统为软件支撑平台 同时提供 1 个 R
  • Jemalloc free的过程

    redis第一次调用free函数 gdb bt 0 je free ptr 0x7ffff661b000 at src jemalloc c 1837 1 0x000000000043194e in zfree ptr 0x7ffff661
  • 由java速通python(四、文件进程线程)

    45 IO编程 文件读写 with open path to file r as f print f read 这和前面的try finally是一样的 但是代码更佳简洁 并且不必调用f close 调用read 会一次性读取文件的全部内容
  • Python基础教程(7)——模块导入与文件读写

    老样子 先回顾上一节的学习内容 回顾上一节的学习内容 我们主要学习了类与函数的相关知识 不知道你掌握得如何呢 在今天的课程中 我们将会运用之前学到的知识 包括类 函数和字典等内容 如果你之前的知识还没有牢固掌握 可以翻看之前的内容进行复习
  • 分布式事务:解决方案之2PC实战

    说完 分布式事务 解决方案之2PC理论 我们现在就要在理论的基础上实践一把 1 业务说明 下面我们通过Seata中间件实现分布式事务来模拟两个账户的转账交易过程 交易过程是 张三给李四转账指定金额 2 开发环境 数据库 MySQL 5 6