分布式事务理论及Seata实践

news2024/11/15 12:08:34

分布式事务简介

事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。事务的四个特征(ACID)

  • 原子性(Atomicity): 指一组操作要么全部执行,要么全部不执行。在事务执行过程中,如果出错则会滚到事务开始前的状态,所有操作像一个原子,不可拆分。
  • 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。
  • 隔离性(Isolation):同一时间,只允许一个事务操作同一条数据,并且操作对其他事务不可见,不同事务之间也不会有干扰,
  • 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

传统的单体应用借助关系数据库的ACID特性能很好的保证数据一致性,但是随着系统的发展,由单体应用向分布式、微服务的演变,传统的事务无法协调多个服务、多个数据库之间的事务,是之达到统一提交或统一回滚状态。

分布式事务是指事务的参与者、资源服务器以及事务管理器分别位于不同的分布式系统的不同结点之上,一次分布式事务涉及到多个系统、数据库之间的协调,保证分散在各结点的事务操作要么全部成功,要么全部失败。

分布式事务理论

CAP理论

CAP理论对分布式系统特性做了高度抽象,形成了三个指标:

  • 一致性(Consistency):多个结点的数据需时刻保持一致,用户无论访问哪个结点读取的数据是一致的(强一致性)。
  • 可用性(Availability):指任何来自客户端的请求,不管访问哪个非故障结点,都能得到响应数据,但并不保证是最新的数据。可用性的两个关键一个是合理的时间,一个是合理的响应。
  • 分区容错性(Partition Tolerance):将服务分散在多个节点上,当节点间出现任务数量的消息丢失或高延迟的时候,系统任能持续的工作。

image-20240106100120139

在分布式系统中,只要有网络交互就一定存在延迟和数据丢失,这是我们必须接受的,同时还要保证系统不能挂掉。节点间的分区故障是必然存在的,也就是说分区容错性(P)是必须要保证的。现在就只剩下一致性(C)和可用性(A)之间选择一个了。

当选择了一致性(C),系统能保证读取到最新的数据,但节点之间数据同步需要时间,就会导致在读取数据时发生阻塞而超时,为了不破坏一致性,可能会因为无法响应最新数据而返回错误信息。

当选择了可用性(A),系统将始终响应客户端的查询,返回特点的信息,但如果发生网络分区、或者数据延迟,返回的数据并不一定是全局最新数据。

BASE理论

由于CAP理论我们只能在C、A、P中选择其中两个。BASE理论是对CAP中一致性和可用性权衡的结果。它的核心思想是,如果非必须,不推荐使用强一致性,鼓励优先考虑可用性,根据业务的场景来实现弹性的基本可用,以及实现数据最终一致性。

  • BA:Basic Available基本可用,当系统出现不可预知的故障,允许损失部分可用性,但不是完全不可用。

  • S:Soft State柔性状态,数据存在一个中间状态,并该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。

  • E:Eventual Consisstency最终一致性,经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

分布式事务解决方案

两阶段提交(2PC)
  • 事务发起阶段:

事务的发起者提出一个request(比如用户下单购买某个商品),要求其依赖的服务(事务的执行者)本地执行业务逻辑。执行成功本地事务不提交但要告诉发起者本地已经执行成功;执行失败执行者告诉发起者本地作业执行失败

  • 事务提交/回滚阶段:

事务发起者根据事务发起阶段收集到的信息决定提交/回滚

如果全部执行者都反馈成功那么发起者通知所有执行者提交事务

如果存在执行者反馈失败,则发起者通知所有参与者取消事务

image-20240107161725860

三阶段提交(3PC)
  • CanCommit(询问阶段):

事务协调者向参与者发送事务执行请求,询问是否可以完成指令,参与者只需要回答是不是即可,不需要做正真的事务操作,这个阶段会有超时终止机制。

  • PreCommit(准备阶段):

事务协调者会根据参与者的反馈结果决定是否继续执行,如果在询问阶段所有参与者都返回可以执行操作,则事务协调者会向所有参与者发送PreCommit请求,参与者收到请求后会写redo和undo日志,执行事务操作但是不提交事务,然后返回ACK响应等待事务协调者的下一步通知。如果询问阶段任意参与者返回不能执行操作的结果,那么事务协调者会向所有参与者发送事务中断请求。

  • DoCommit(提交或回滚阶段):

这个阶段也会存在两种结果,根据上一步骤的执行结果来决定DoCommit的执行方式。如果每个参与者在PreCommit阶段都返回成功,那么事务协调者会向所有的参与者发起事务提交指令。反之,如果参与者中的任一个参与者返回失败,那么事务协调者就会发起中转指令来回滚事务。

image-20240107162021011

TCC

TCC是将事务分为Try(尝试)、Confirm(确认)和Cancel(取消)三个阶段。每个阶段有开发者自己控制,避免了长事务的问题。

image-20240107162732336

TCC事务模式需要考虑下面几个问题:

  • 空回滚:当某分支事务的try阶段阻塞时,可能导致全局事务超时而触发二阶段的cancel操作。在未执行try操作时先执行了cancel操作,这时cancel不能做回滚,就是空回滚

  • 悬挂:对于已经空回滚的业务,如果以后继续执行try,就永远不可能confirm或cancel,这就是业务悬挂

  • 幂等:Confim、Cancel阶段不论网络原因或者业务异常,都会根据日志记录重复执行操作,所以需要保持接口的幂等性,也就是最多执行一次

Seata框架介绍

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

image-20240107164948026

Seata由三种角色组成:

  • TC (Transaction Coordinator) - 事务协调者

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

  • TM (Transaction Manager) - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

  • RM (Resource Manager) - 资源管理器

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

XA模式

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

1 TM负责定义全局事务的边界,向TC申请,开启一个全局事务;

2 全局事务创建成功后,生成全局唯一的XID;

3 XID会在微服务请求链路上下文中传播;

4 RM向TC注册分支事务,并归属到XID对应的全局事务进行调度;

5 TM向TC发起相应XID的全局事务提交或回滚决议;

6 TC完成对XID管理的全部分支事务提交或回滚的调度;

我们看下下面的demo,有order服务负责创建订单,并且通过Fegin调用库存服务扣库存,如果库存不足则回滚。

seata-order

    @GlobalTransactional(rollbackFor = {Exception.class})
    @Transactional
    public String createOrder(String userId, String itemId, Integer num) {

        Order order = new Order();
        order.setUserId(userId);
        order.setItemId(itemId);
        order.setNum(num);
        orderRepository.save(order);

        // 扣除库存
        inventoryFeign.adjust(itemId, num);
        return "创建成功";
    }

seata-inventory

public void adjust(String itemId, Integer num) {
       
        Inventory inventory = inventoryDao.findByItemId(itemId);

        if(inventory.getInventory() < num){
            throw new RuntimeException("库存不足");
        }
        inventory.setInventory(inventory.getInventory() - num);

        inventoryDao.save(inventory);

    }

库存表中有商品编号为10000的商品,库存为10。以debug的方式启动服务,在扣库存的地方打上端点,你会发现在扣完库存,库存的数量并没有减少,订单也没用创建,并且行记录也被锁住,直到事务提交,才能看到订单创建和库存扣减,如果扣除不足,订单也会回滚。

image-20240107082151767

前面我们提到过,AX是基于数据库的事务特征,属于两阶段提交,所以在整体事务提交前,各服务数据不可见。

XA模式的优点:

  • 事务的强一致性,满足ACID原则。

  • 常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点:

  • 性能较差,因为一阶段需要锁定数据库资源,等待二阶段结束才释放,所以性能较差
  • 依赖关系型数据库实现事务。NoSQL参与不进来
AT模式

AT模式是基于两阶段协议的演变:

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

修改为AT模式只需要修改配置:

seata.dataSourceProxyMode=AT
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) E

AT模式需要新增一张undo_log表,用来记录执行SQL的回滚SQL,比如业务执行了INSERT操作,就会记录一下对应的DELETE语句。所以AT模式下是不依赖与数据库的事务。

AT模式的优点:

  • 一阶段完成直接提交事务,释放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵入,框架自动完成回滚和提交

AT模式的缺点:

  • 两阶段之间属于软状态,属于最终一致
  • 框架的快照功能会影响性能,但比XA模式要好很多
TCC模式

TCC 模式,不依赖于底层数据资源的事务支持:

  • 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
  • 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
    放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵入,框架自动完成回滚和提交

AT模式的缺点:

  • 两阶段之间属于软状态,属于最终一致
  • 框架的快照功能会影响性能,但比XA模式要好很多
TCC模式

TCC 模式,不依赖于底层数据资源的事务支持:

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

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

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

相关文章

算法第十三天-组合总和Ⅱ

组合总和Ⅱ 题目要求 解题思路 按顺序搜索&#xff0c;设置合理的变量&#xff0c;在搜索的过程中判断是否会出现重复集结果。重点理解对输入数组排序的作用和参考代码中 大剪枝和小剪枝 的意思 这道题域上一问的区别在于&#xff1a; 第39题&#xff1a;candidates中的数字…

构建异地企业网络互联的高效路径

在当今数字化浪潮中&#xff0c;企业的业务拓展已不再受限于地理位置。为了在全球竞争中立于不败之地&#xff0c;越来越多的企业选择在不同城市设立分支机构&#xff0c;构建异地网络&#xff0c;实现高效的协同办公。本文将深入探讨在北上广等经济发达地区&#xff0c;如何通…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第二天-Linux开发板外设开发(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

PLC水箱液位控制、神经网络、PID模糊控制等Factory IO仿真

水箱液位控制的PLC仿真程序。TIA Portal V17 中的代码。该水箱在 Factory IO 3D 仿真软件中建模&#xff0c;将控制算法写入PLC&#xff0c;与Factory IO联合仿真进行实验。项目包括一个简单的自动化系统、一个带有两个泵的液罐和一个液位传感器。从 HMI 中&#xff0c;我们可以…

2024阿里云优惠_阿里云活动中心

2024年阿里云优惠活动大全&#xff0c;包括阿里云服务器优惠活动清单、配置价格表、域名优惠活动、阿里云建站活动、阿里云优惠代金券免费领取、对象存储OSS活动、企业邮箱优惠、无影云电脑优惠、CDN特惠等等&#xff0c;阿里云百科aliyunbaike.com分享2024阿里云优惠活动大全_…

Docker给容器添加新端口映射

Docker容器添加新端口映射 查看运行的容器 docker ps查看容器挂载目录 docker inspect [容器id]我这里是[容器name] 停止容器 docker stop pythonWarning: Stopping docker.service, but it can still be activated by: docker.socket 停止docker服务 systemctl stop dock…

el-table魔改样式出现BUG,表格内容区域出现滚动条

问题&#xff1a;el-table表格内容区域在高度自适应的情况下冒出滚动条 解决办法&#xff1a; 代码排查后发现时我设置了fixed:“xxx” 属性就会导致滚动条出现的问题&#xff0c;不设置则无。 [{ type: index, label: 序号, fixed: left },{ prop: enterprisesName, label: …

数据库的连接

连接数据库 我们使用WinR输入cmd打开运行窗口 输入:sqlplus并回车 输入用户名和密码,我用的是Scott,密码我自己设置的123456,Scott默认的密码是tiger,回车 这种情况表示登录成功 在连接Scott成功的情况下创建一些数据,在我的资源里面有个Oracle数据基础可以下载,直接复制粘…

09.简单工厂模式与工厂方法模式

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物。——《道德经》 最近小米新车亮相的消息可以说引起了不小的轰动&#xff0c;我们在感慨SU7充满土豪气息的保时捷设计的同时&#xff0c;也深深的被本土品牌的野心和干劲所鼓舞。 今天我们就接着这个背景&…

Debezium发布历史49

原文地址&#xff1a; https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 使用发件箱模式进行可靠的微服务数…

JSP内置对象:forward动作标记和sendRedirect()方法实现页面跳转的区别

1.forward为服务器跳转&#xff0c;浏览器的地址栏不变&#xff1b; sendRedirect&#xff08;&#xff09;为客户端跳转&#xff0c;浏览器的地址栏改变变新页面的URL。 2.执行到forward标记出现处停止当前JSP页面的继续执行&#xff0c;而转向标记中的page属性指定的页面&am…

【Matplotlib】基础设置之图像处理05

图像基础 导入相应的包&#xff1a; import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np %matplotlib inline导入图像 我们首先导入上面的图像&#xff0c;注意 matplotlib 默认只支持 PNG 格式的图像&#xff0c;我们可以使用 mpimg.im…

一文搞定JVM内存模型

鲁大猿&#xff0c;寻精品资料&#xff0c;帮你构建Java全栈知识体系 www.jiagoujishu.cn 运行时数据区 内存是非常重要的系统资源&#xff0c;是硬盘和 CPU 的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、…

56K star!一键拥有跨平台 ChatGPT 应用:ChatGPT-Next-Web

前言 现在围绕 openai 的客户端层出不穷&#xff0c;各路开发大神可以说是各出绝招&#xff0c;我也试用过几个国内外的不同客户端。 今天我们推荐的开源项目是目前我用过最好的ChatGPT应用&#xff0c;在GitHub超过56K Star的开源项目&#xff1a;ChatGPT-Next-Web。 ChatGP…

Java分布式锁理论(redis、zookeeper) 详解

目录 一、分布式锁有哪些应用场景&#xff1f; 二、分布式锁的实现方案 三、zookeeper实现分布式锁 一直不释放锁怎么办&#xff1f; 如何避免分布式锁羊群效应问题&#xff1f; 四、redis实现分布式锁 一、分布式锁有哪些应用场景&#xff1f; 1、定时任务 2、秒杀抢购…

XAgent调研

文章目录 1 简介2 快速测试 Quick Start3 结构分析 1 简介 XAgent&#xff08;链接&#xff09;是一个开源的&#xff0c;基于大语言模型的agent构建框架&#xff1b;其目标是构建出能够辅助人类处理各类任务的自动助手 定位&#xff1a;一个全能的&#xff0c;自动的辅助agen…

智邦国际ERP GetPersonalSealData.ashx接口存在SQL注入漏洞 附POC软件

@[toc] 智邦国际ERP GetPersonalSealData.ashx接口存在SQL注入漏洞 附POC软件 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

【普中开发板】基于51单片机的温度报警器LCD1602_可调上下限( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的温度报警器LCD1602_可调上下限 1.主要功能&#xff1a;资料下载链接&#xff1a; 普中开发板实物演示图&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的温度报警器LCD1602_可调上下限 ( proteus仿真程序设计报告讲解视频&a…

安全基础~信息搜集3

文章目录 知识补充APP信息搜集php开发学习理解漏洞 知识补充 端口渗透总结 python Crypto报错&#xff1a;https://blog.csdn.net/five3/article/details/86160683 APP信息搜集 1. AppInfoScanner 移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具 使用教程 演示&…

LCD—液晶显示

本节主要介绍以下内容 显示器简介 液晶控制原理 秉火3.2寸液晶屏简介 使用FSMC模拟8080时序 NOR FLASH时序结构体 FSMC初始化结构体 一、显示器简介 显示器属于计算机的I/O设备&#xff0c;即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。…