分布式事务(典型的分布式事务场景+CAP+解决方案)

news2024/11/16 21:44:42

分布式事务与分布式锁的区别:

分布式锁解决的是分布式资源抢占的问题;分布式事务和本地事务是解决流程化提交问题

SQL中的4个事务隔离级别:(1)读未提交(2)读已提交(3)可重复读(4)串行化

MySQL的本地事务实现方案

操作单一的数据库,这种情况下的事务称之为本地事务(Local Transaction)。
通过 日志和锁事务隔离级别 来保证的事务的 ACID特性。详见我的这篇 并发性事务带来的问题+并发控制(MySQL事务隔离级别、MySQL 锁)

多个事务并发操作时,数据库中会出现三种问题:脏读,幻读,不可重复读。

分布式事务的基本概念

保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致。分布式系统中操作要么一起成功,要么一起失败,必须是一个整体性的事务。
简单的说,在分布式系统上一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务节点上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。

当本地事务要扩展到分布式时,它的复杂性进一步增加了。

  • 1.存储端的多样性。
    首先就是存储端的多样性。本地事务的情况下,所有数据都会落到同一个DB中,但是,在分布式的情况下,就会出现数据可能要落到多个DB,或者还会落到Redis,落到MQ等中。
  • 2.事务链路的延展性
    本地事务的情况下,通常所有事务相关的业务操作,会被我们封装到一个Service方法中。而在分布式的情况下,请求链路被延展,拉长,一个操作会被拆分成多个服务,它们呈现线状或网状,依靠网络通信构建成一个整体。在这种情况下,事务无疑变得更复杂。

一般情况下,在分布式下,事务会被拆分解决,并根据不同的情况,采用不同的解决方案。

典型的分布式事务场景:

  1. 跨库事务
    个应用某个功能需要操作多个库,不同的库中存储不同的业务数据。
  2. 分库分表
    通常一个库数据量比较大或者预期未来的数据量比较大,都会进行水平拆分,也就是分库分表。
    对于分库分表的情况,一般开发人员都会使用一些数据库中间件来降低sql操作的复杂性。

如,对于sql:insert into user(id,name) values (1,"tianshouzhi"),(2,"wangxiaoxiao")。这条sql是操作单库的语法,单库情况下,可以保证事务的一致性。
但是由于现在进行了分库分表,开发人员希望将1号记录插入分库1,2号记录插入分库2。所以数据库中间件要将其改写为2条sql,分别插入两个不同的分库,此时要保证两个库要不都成功,要不都失败,因此基本上所有的数据库中间件都面临着分布式事务的问题

  1. 微服务化
    将复杂业务拆分成不同的独立服务,以简化业务逻辑。拆分后,独立服务之间通过RPC框架来进行远程调用,实现彼此的通信。下图演示了一个3个服务之间彼此调用的架构,典型分布式事务场景:
    在这里插入图片描述

数据一致性和高性能,是天生的矛盾

分布式事务实现方案必须要考虑性能的问题,如果为了严格保证ACID特性,导致性能严重下降,那么对于一些要求快速响应的业务,是无法接受的。

CAP定理

WEB服务无法同时满足一下3个属性:

  • 一致性(Consistency) : 客户端知道一系列的操作都会同时发生(生效)。
  • 可用性(Availability) : 每个操作都必须以可预期的响应结束。
  • 分区容错性(Partition tolerance) : 即使出现单个组件无法可用,操作依然可以完成。

具体地讲在分布式系统中,一个Web应用至多只能同时支持上面的两个属性。因此,设计人员必须在一致性与可用性之间做出选择。

权衡:
C 必须保证。网络发生故障宁可停止服务,这是保证 CA,舍弃 P。
还有一种是保证 CP,舍弃 A。例如网络故障是只读不写。

CAP和ACID中的A和C区别

(1)A的区别:

  • ACID中的A指的是原子性(Atomicity),是指事务被视为一个不可分割的最小工作单元,事务中的所有操作要么全部提交成功,要么全部失败回滚;
  • CAP中的A指的是可用性(Availability),是指集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求;
    (2)C的区别:
  • ACID一致性是事务执行前后,数据库完整性
  • CAP的一致性是分布式节点的数据的一致性

分布式事务了解吗?你们是如何解决分布式事务问题的?

这篇博客超详细 分布式事务详解

Seata AT模式和Seata TCC是在生产中最常用

  • 强一致性模型,Seata AT 强一致方案 模式用于强一致主要用于核心模块,例如交易/订单等。

  • 弱一致性模型。Seata TCC 弱一致方案一般用于边缘模块例如库存,通过TC的协调,保证最终一致性,也可以业务解耦。

(1)强一致性场景
电商交易交易中的库存和订单、优惠券),使用成熟的如中间件Seata AT模式。
Seata AT模式,保障强一致性,支持跨多个库修改数据

订单库:增加订单
商品库:扣减库存
优惠券库:预扣优惠券

(2)弱一致性场景
对于数据一致性要求没有那些特别严格、或者由不同系统执行子事务的场景,可以回答使用Seata TCC 保障弱一致性方案

电商订单支付服务,更新订单状态,发送成功支付成功消息,只需要保障弱一致性即可。

(3)最终一致性场景
基于可靠消息的最终一致性,各个子事务可以较长时间内异步,但数据绝对不能丢的场景。可以使用异步确保型事务事。

可以使用基于MQ的异步确保型事务,比如电商平台的通知支付结果:
积分服务:增加积分
会计服务:生成会计记录

seata

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

Seata 分三大模块 :

  • TC :事务协调者。负责我们的事务ID的生成,事务注册、提交、回滚等。
  • TM:事务发起者。定义事务的边界,负责告知 TC,分布式事务的开始,提交,回滚。
  • RM:资源管理者。管理每个分支事务的资源,每一个 RM 都会作为一个分支事务注册在 TC。

可靠消息最终一致性【RocketMQ 事务消息方案】----尚未学完

可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致。 此方案是利用消息中间件完成。
在这里插入图片描述
事务发起方(消息生产方)将消息发给消息中间件,事务参与方从消息中间件接收消息,事务参与方(消息消费方)和消息中间件之间都是通过网络通信,由于网络通信的不确定性会导致**分布式事务问题。**因此可靠消息最终一致性方案要解决以下几个问题:
【1】本地事务与消息发送的原子性问题
【2】事务参与方接收消息的可靠性
【3】消息重复消费的问题

解决方案【RocketMQ事务消息方案 】:
RocketMQ 是一个来自阿里巴巴的分布式消息中间件,RocketMQ 事务消息设计主要为解决 Producer 端的消息发送与本地事务执行的原子性问题。

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

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

相关文章

【React】详解样式控制:从基础到进阶应用的全面指南

文章目录 一、内联样式1. 什么是内联样式?2. 内联样式的定义3. 基本示例4. 动态内联样式 二、CSS模块1. 什么是CSS模块?2. CSS模块的定义3. 基本示例4. 动态应用样式 三、CSS-in-JS1. 什么是CSS-in-JS?2. styled-components的定义3. 基本示例…

基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(1)-项目搭建(前期准备工作)

这是项目的初始页面 接下来我先写下我的初始项目搭建 技术支持:JAVA、JSP 服务器:TOMCAT 7.0.86 编程软件:IntelliJ IDEA 2021.1.3 x64 首先我们打开页面,准备搭建项目的初始准备 1.New Project 2.随后点击Next,勾…

【数据结构】顺序表(杨辉三角、简单的洗牌算法)

🎇🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔 💪💪💪 谢谢你这么帅…

【机器学习】GPT LoRA:大模型微调的艺术与效率

文章目录 往期热门专栏回顾1、前言介绍 1.1、文生图效果 2、LoRA的工作原理3、LoRA的应用场景4、LoRA的优势5、LoRA的挑战6、LoRA的实现7、未来展望 1、前言介绍 在深度学习和自然语言处理领域,大规模预训练模型(如GPT-3、BERT等)已经展示了…

ansible基础讲解和加密文件讲解

ansible最重要的三个文件 /etc/ansible/ansible.cfg #####ansible的配置文件 /etc/ansible/host ##清单文件inventory ansible-navigator.yml ####以yml结尾的文件可以理解为conf结尾的文件,是配置文件,用于设置剧本playbook playbook讲解 以.yml结…

【Android】Activity与Fragment的数据传递

上一篇文章学到了碎片的创建与生命周期,接下来学习碎片的常用操作,其中会用到上一篇文章的三个碎片,就做一个简单的说明吧:LeftFragment(包含一个按钮)、RightFragment4(以粉色为背景的文本&…

优化医疗数据管理:Kettle ETL 数据采集方案详解

在现代医疗保健领域,数据的准确性、完整性和及时性对于提高医疗服务质量和患者护理至关重要。为了有效管理和利用医疗数据,Kettle ETL(Extract, Transform, Load)数据采集方案成为了许多医疗机构的首选工具之一。本文将深入探讨Ke…

【Gitlab】SSH配置和克隆仓库

生成SSH Key ssh-keygen -t rsa -b 4096 私钥文件: id_rsa 公钥文件:id_rsa.pub 复制生成的ssh公钥到此处 克隆仓库 git clone repo-address 需要进行推送和同步来更新本地和服务器的文件 推送更新内容 git push <remote><branch> 拉取更新内容 git pull &…

MySQL数据库的DQL的高级数据查询语句

目录 非等值联查&#xff1a; 等值联查&#xff1a; eg&#xff1a;5张表联查 连接查询——left/right/inner join on eg: 连接查询——union Eg&#xff1a; 不去重的并集——union all 子查询&#xff08;内部查询&#xff09; 1、where型子查询 2、from型子查询&a…

Servlet2-HTTP协议、HttpServletRequest类、HttpServletResponse类

目录 HTTP协议 什么是HTTP协议 HTTP协议的特点 请求的HTTP协议格式 GET请求 POST请求 常用的请求头说明 哪些是GET请求&#xff0c;哪些是POST请求 响应的HTTP协议格式 常见的响应码说明 MIME类型说明 HttpServletRequest类 作用 常用方法 如何获取请求参数 po…

Linux:基础

一、安装 二、 一些组件 2.1 git管理 集中式版本控制系统:版本库是集中存放在中央服务器的,需要时要先从中央服务器取得最新的版本进行修改,修改后再推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作,网速慢的话影响太大。 分布式版本控制系统:分布…

MySQL SQL 编程练习

目录 创建表并插入数据 查看表结构 创建触发器 创建INSERT 触发器 创建DELETE 触发器 创建更新触发器 创建存储过程 创建提取emp_new表所有员工姓名和工资的存储过程s1 创建存储过程s2&#xff0c;实现输入员工姓名后返回员工的年龄 创建一个存储过程s3&#xff0c;有2个参数&…

Apache ShardingSphere Proxy5.5.0实现MySQL分库分表与读写分离

1. 前提准备 1.1 主机IP:192.168.186.77 version: 3.8services:mysql-master:image: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: masterMYSQL_PASSWORD: 123456MYSQL_DATABASE: db1 ports:- "3306:3306&quo…

搭建NFS、web、dns服务器

目录 1、搭建一个nfs服务器&#xff0c;客户端可以从该服务器的/share目录上传并下载文件 服务端配置&#xff1a; 客户端测试&#xff1a; 2、搭建一个Web服务器&#xff0c;客户端通过www.haha.com访问该网站时能够看到内容:this is haha 服务端配置&#xff1a; 客户端…

UE5+OpenCV配置(Windows11系统)

一、概述 因为需要在UE5中使用OpenCV这些工具进行配置&#xff0c;所以在网络上参考借鉴一些资料进行配置。查询到不少的资料&#xff0c;最后将其配置成功。在这里顺便记录一下自己的配置成功的过程。 二、具体过程 &#xff08;一&#xff09;版本 使用Windows11系统、UE5.…

vue3前端开发-小兔鲜项目-路由拦截器增加token的携带

vue3前端开发-小兔鲜项目-路由拦截器增加token的携带&#xff01;实际开发中&#xff0c;很多业务接口的请求&#xff0c;都要求必须是登录状态&#xff01;为此&#xff0c;这个token信息就会频繁的被加入到了请求头部信息中。request请求头内既然需要频繁的携带这个token.我们…

百易云资产管理运营系统 comfileup.php 文件上传致RCE漏洞复现(XVE-2024-18154)

0x01 产品简介 百易云资产管理运营系统,是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理,包括资产的登记、盘点、评估、处置等多个环节,同时提供强大的运营分析功能,帮助企业优化资产配置,提升运营效率。 0x02 漏…

BUUCTF [安洵杯 2019]easy_serialize_php

这道题题目说easy但是对我来说极其不友好&#xff01;看了很多wp讲的模棱两可&#xff0c;我尽量来说清楚点 代码解析&#xff1a; 这里$function $_GET[f]&#xff0c;是我们通过get方式传递的&#xff0c;因为注释提示有东西先传fphpinfo看看 找到了一个东西&#xff0c;很…

linux下usb抓包:wireshark+usbmon

step1. 加载usbmon模块 sudo mount -t debugfs none /sys/kernel/debug #这一步一般不用做&#xff0c;debugfs默认都是挂载的 sudo modprobe usbmon #如果这个命令找不到usbmon&#xff0c;那手动从/lib/modules中insmod sudo apt-get install wireshark 若加载成功&…