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

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

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

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.mzph.cn/web/49191.shtml

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

相关文章

如何远程开发完整分析一台新能源车BMS电池管理系统CAN数据矩阵

随着我国新能源汽车的崛起,从网络管理平台、数据中心、科研机构、高校教学、车型对标、整车DBC控制策略分析、电池管理系统研究、电池健康管理、网约车管理、电池梯度利用、车队管理等多方面的市场需求,完整分析一台新能源车BMS电池管理系统的CAN矩阵开发…

【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录 项目背景造数据训练 项目背景 在日常开发中,经常会遇到一些图片是由多个图片拼接来的,如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢,这是文本要做的事情。 造数据 假设拼接方式有…

生成式AI与自然语言处理的结合-提升生成式AI的语言理解能力

引言 近年来,生成式AI已逐渐成为科技发展的前沿领域,其未来发展方向备受关注。对于人类生活和工作方式的影响,生成式AI在对话系统(Chat)和自主代理(Agent)中的表现引发了广泛讨论。本文将全面探…

Postman中的API Schema验证:确保响应精准无误

Postman中的API Schema验证:确保响应精准无误 在API开发和测试过程中,验证响应数据的准确性和一致性是至关重要的。Postman提供了一个强大的功能——API Schema验证,它允许开发者根据预定义的JSON Schema来检查API响应。本文将详细介绍如何在…

微软全球蓝屏带来的思考及未来战争走向

微软全球蓝屏事件不仅揭示了技术层面的问题和挑战,还引发了对未来战争走向的一些深入思考。以下是关于这些思考的内容: 微软全球蓝屏带来的思考: 系统稳定性与安全性:微软全球蓝屏事件凸显了操作系统稳定性和安全性的重要性。一…

Oracle配置TCPS加密协议测试

文章目录 一、环境信息二、配置过程1.创建证书2.监听配置2.1.配置sqlnet.ora2.2.配置listener.ora文件2.3.配置tnsnames.ora文件2.4.重载监听 3.数据库本地测试3.1. tcps登录测试3.2.日志监控 一、环境信息 操作系统:Linux 版本信息:Oracle 19c 参考文档…

asp.net core 集成redis详解

ASP.NET Core 集成 Redis 详解如下: 目录 一、Redis简介 二、在ASP.NET Core中集成Redis 三、Redis的高级用法 四、注意事项 一、Redis简介 Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis内置了复制、Lua脚本、…

在可编辑 div (contentEditable)末尾插入换行符(\n 或 \<br\>)无效的解决办法

背景: 给可编辑 div 末尾插入换行符, 发现仍然未换行; 解决方法: 提前给 div 末尾插入一个 <br> 就行了, 之后看自己情况要不要去掉 示例代码: // 如果输入框末尾没有 BR 换行符, 则自动加一个, 避免 Ctrl Enter 两次才显示 const currLastEl dom_input.lastElement…

缓存框架 Caffeine 的可视化探索与实践

作者&#xff1a;vivo 互联网服务器团队- Wang Zhi Caffeine 作为一个高性能的缓存框架而被大量使用。本文基于Caffeine已有的基础进行定制化开发实现可视化功能。 一、背景 Caffeine缓存是一个高性能、可扩展、内存优化的 Java 缓存库&#xff0c;基于 Google 的 Guava Cac…

Ubuntu20.04 设置静态ip

Ubuntu 从 17.10 开始&#xff0c;已放弃在 /etc/network/interfaces 里固定 IP 的配置&#xff0c;interfaces 文件不复存在&#xff0c;即使配置也不会生效&#xff0c;而是改成 netplan 方式 &#xff0c;配置写在 /etc/netplan/01-netcfg.yaml &#xff0c;50-cloud-init.y…

机器学习笔记-02-基础线性算法认识(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文可以让读者用作自查&#xff0c;答案在后面&#xff0…

跟《经济学人》学英文:2024年07月20日这期 At last, Wall Street has something to cheer

At last, Wall Street has something to cheer 华尔街终于有值得欢呼的事情了 at last&#xff1a;终于&#xff1b;最后&#xff1b; Consumer banks, on the other hand, are starting to suffer 原文&#xff1a; Capital markets are twitchy. When interest rates spi…

数据危机!4大硬盘数据恢复工具,教你如何正确挽回珍贵记忆!

在这个数字化的时代&#xff0c;硬盘里的数据对我们来说简直太重要了。但糟糕的是&#xff0c;数据丢失这种事时不时就会发生&#xff0c;可能是因为不小心删了&#xff0c;硬盘坏了&#xff0c;或者中了病毒。遇到这种情况&#xff0c;很多人可能就慌了&#xff0c;不知道怎么…

货架管理a

路由->vue的el标签->Api->call方法里calljs的api接口->数据声明const xxxData-> 编辑按钮:点击跳出页面并把这一行的数据给到表单formDataba2 保存按钮:formDataba2改过的数据->xxApi发送->查询Api 跳转仓库:把tableData.value数据清空->callXxxAp…

Windows环境下安装Redis并设置Redis开机自启

文章目录 0. 前言1. 下载 Windows 版本的Redis2. 为 Redis 设置连接密码&#xff08;可选&#xff09;3. 启动 Redis4. 设置 Redis 开机自启4.1 将 Redis 进程注册为服务4.2 设置 Redis 服务开机自启4.3 重启电脑测试是否配置成功4.4 关闭 Redis 开机自启&#xff08;拓展&…

Typora笔记上传到CSDN

1.Typora 安装 Typora链接&#xff1a;百度网盘 提取码&#xff1a;b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…

Ubuntu 24 PXE Server bios+uefi 自动化部署esxi 6 7 8

pxe server 前言 PXE(Preboot eXecution Environment,预启动执行环境)是一种网络启动协议,允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器,它提供了启动镜像和引导加载程序,使得客户端计算机可以通过网络启动并安装操作系统或运行其他软件…

java学习记录09:Lambda表达式与引用

Lambda表达式 例子&#xff1a; &#xff08;o1&#xff0c;o2&#xff09; -> Interger.compare(o1,o2); 格式&#xff1a; -> : lambda操作符 -> 的左边: lambda形参列表&#xff0c;对应着要重写的接口中的抽象方法的形参列表。 ->的右边&#xff1a;lamb…

python编程表白爱心代码,来自程序员的浪漫!

Python爱心表白代码 感觉的紫色要更加浪漫&#xff0c;其中的文字也是可以直接更改的&#xff0c;非常方便 <文末附带精品籽料> 改变爱心的颜色: 在源代码的13-15行位置&#xff0c;可以通过更改16进制颜色色值进行改变爱心的颜色&#xff0c;这里小编改了一点绿色&…

阶层差异下的社会角色与认知逻辑

阶层差异下的社会角色与认知逻辑 在中国传统文化中&#xff0c;有句古话&#xff1a;“仗义每从屠狗辈&#xff0c;负心多是读书人。”这句话揭示了不同社会阶层的人&#xff0c;在认知和行为上存在的差异。 社会底层&#xff1a;道德与情感的坚守者 社会底层人群&#xff0c…