关于事务的一些梳理

关于事务的一些梳理

  • 什么是事务
  • 本地事务
  • 分布式事务
  • 分布式事务解决方案
    • 分阶段提交
      • 两阶段提交 2PC
      • 三阶段提交 3PC
    • TCC补偿
    • MQ
      • MQ可靠投递的方案
    • 不同方案的区别
  • 分布式事务中间件

什么是事务

数据库管理系统中的一个基本概念,是指一组操作要么全部成功,要么全部失败。包含ACID四个特性:

  1. 原子性(Atomicity):整个事务是不可分割的,事务的任何环节失败则整个事务失败并且回滚至事务开始之前的状态。
  2. 一致性(Consistency):数据始终满足一致性,满足业务规则和约束
    ○ 一致性确保事务将数据库从一个一致的状态转换到另一个一致的状态。在事务开始之前和事务结束之后,数据库的状态必须是有效的,并且满足所有的业务规则和约束条件。
  3. 隔离性(Isolation):
    ○ 隔离性确保并发执行的事务之间互不影响。不同的隔离级别决定了事务间共享数据的程度,如
    读未提交(Read Uncommitted)、
    读提交(Read Committed)、
    可重复读(Repeatable Read)、
    可序列化(Serializable)。
  4. 持久性(Durability):一旦事务提交,其结果永久保存,即使系统崩溃。

本地事务

本地事务(本地ACID事务)中,底层是由数据库提供支持的,在一次数据库连接中,我们可以使用编程式事务进行事务的开启、提交和回滚。在Spring中,如果配置了事务管理器,还可以通过声明式注解进行事务操作。
那么数据库是如何实现事务的呢?大体上可以理解为通过日志管理和两阶段提交协议来实现的,通过日志管理中的redoLog和undoLog来记录变更前数据和变更后数据,再结合两阶段提交,在两阶段提交的准备阶段,将涉及变更的数据记录到redoLog中,在提交阶段,将redoLog中的数据变更到数据库,如果某个表更新失败,则通过undoLog全部回滚。

分布式事务

从本地事务可以看出,在本地事务的整个过程中,数据库在涉及多张表的事务操作中扮演了全局事务的协调者的角色。由于分布式系统中,事务的参与者已经不再局限于一次数据库连接中,那么要想满足事务的特性,就要解决事务中各个参与者之间的协调问题。

分布式事务解决方案

分阶段提交

通过全局协调者对整个事务中所有的参与者进行协调,如果所有参与者都准备就绪,则进行提交。因此这个 过程是分阶段的。包含预提交阶段和提交阶段。由于在准备阶段,事务协调者需要与所有的事务参与者通信,以确定整体事务是否可提交。

两阶段提交 2PC

○ 阻塞问题:如果协调者崩溃,参与者会一直等待,可能会导致长时间的阻塞。
○ 单点故障:协调者故障,整个分布式事务不可用
需要考虑事务协调者的高可用

三阶段提交 3PC

相较于2PC,加入了预提交阶段(“询问\投票”阶段),增加了中间状态

  1. 减少阻塞时间:通过增加准备阶段,参与者在等待协调者指令时的阻塞时间减少,降低了系统的整体锁定时间,提高了系统的并发能力。
  2. 更高的容错性:在协调者故障时,参与者可以根据预提交阶段的状态,自行决定是否继续等待或回滚,从而减少系统的不确定性和阻塞。

TCC补偿

TCC(try-confirm-cancel)TCC模式允许开发人员在每个阶段都定义自己的业务逻辑和补偿操作,以适应不同的业务需求。
但是,TCC模式要求开发人员在每个阶段都显式定义业务逻辑和补偿操作,增加了系统的复杂性和开发成本,需要设计和维护每个阶段的逻辑,并确保它们之间的一致性。

MQ

本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。

  1. 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
  2. 之后将本地消息表中的消息转发到消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
  3. 在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。

MQ可靠投递的方案

○ 本地消息表(数据的保存和业务操作在一个本地事务中,保证了可靠投递,然后通过定时扫描消息表数据向mq进行投递)
○ 事务消息 RocketMq半消息

为什么业务操作和 MQ消息 不能放在一个事务中
本地消息表和业务操作之所以可以在一个本地事务中,
是因为它们使用一个数据库连接,DMS保证了他们的原子性,
业务操作和mq之间属于跨系统(也属于分布式范畴),虽然在一个
@Transactional方法中,但它们不在一个事务中,无法保证原子性。
比如saveOrder()和sendMq(),如果sendMq响应超时,saveOrder
回滚,但sendMq可能已经执行成功,只不过响应超时而已,这就不一致了。

不同方案的区别

  1. 2PC :保证操作的原子性,达到数据的一致性;
    柔性事务( TCC):直接针对数据,保证数据一致性;

2PC由于需要等待确认所有参与的服务的事务状态,在等待未超时前,各个服务中的数据相当于锁住,高并发场景不适用;
而TCC模式中并不要求强一致,当事务管理器发现某环节异常时调用cancel进行补偿,达到最终一致。这便是柔性事务。

  1. MQ实现事务的思想: 使用事务的目的是程序在异常情况下确保数据的一致性
    能不能通过某种方式保证链路不异常,一定执行成功呢?如果消息被可靠投递,又被消费者可靠消费,保证调用链路的可靠执行也能保证数据的最终一致性。MQ通过异步和重试,可以实现最终一致性。
    2PC和TCC保证一致性的思想是处理异常时,通过回滚,比如对数据进行反向补偿
    MQ的思路则是如何保证每个环节都正常执行,如果程序正确且执行完成,数据一定是一致的。

如何保证每个环节都正确执行呢?
首先要保证消息的可靠投递(投递成功才有后续的事件触发),
其次是MQ的高可用,比如消息数据持久化和多节点部署;
最后是重试(程序执行异常,要么是网络原因,要么是程序本身,网络原因完全可以通过重试解决,bug则需要解决),超出重试阈值进入死信队列由人工兜底。

分布式事务中间件

Seata
hmily
DTM

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

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

相关文章

大模型分布式训练并行技术(一)-概述

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此,我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

Gitee基本指令操作

目录 1.概念 2. git的基本指令 3. .gitignore 文件 4 . Linux git || gitee || github 1.概念 Git是一种版本控制的软件。 Git是免费且开源的。 Git常被称为 去中心化的分布式的 数据存储。 【其实git也可以进行本地版本控制。对于git,可理解为是一个 本地版本…

超轻量级电竞体验,还有8K超高回报率,雷柏VT1 Air MAX上手

PC玩家想要获得更精彩的游戏体验,除了要关注主机上显卡、CPU等方面的配置,还需要键、鼠标的操控体验跟得上节奏,而在这方面,国产品牌雷柏算是行业里的翘楚,尤其是这两年,连续不断的推出了多个电竞系列鼠标&…

3. 函数

函数是 JavaScript 编程中最重要的工具之一。用一个值封装一段程序的概念有很多用途。它为我们提供了一种结构化大型程序的方法,可以减少重复,将名称与子程序关联起来,并将这些子程序相互隔离。 函数最明显的应用是定义新的词汇。在散文中创造…

2024 天池云原生编程挑战赛决赛名单出炉,冠军来自中山大学、昆仑数智战队

9 月 20 日,2024 天池云原生编程挑战赛决赛答辩完美落幕,12 支进入决赛的团队用精彩的答辩,为历时 3 个月的大赛画下了圆满的句号。其中,来自中山大学的陈泓仰以及来自昆仑数智的冉旭欣、沈鑫糠、武鹏鹏, 以出色的方案…

Nordic软件二[蓝牙协议栈初始化卡死(时钟源默认外部晶振但是板子是内部RC)问题][BSP代码模块修改管脚和相关机制]

蓝牙协议栈初始化卡死(时钟源默认外部晶振但是板子是内部RC)问题 本文摘录于:https://blog.csdn.net/chengbaojin/article/details/103778150只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人! 先参考上面的文章做如下修改: …

中国科学院云南天文台博士招生目录

中国科学院云南天文台是专业基础研究与应用研究结合的综合性天文研究机构(其前身是1938年中央研究院天文研究所在昆明东郊凤凰山创建的凤凰山天文台),总部在云南省昆明市,设有两个观测站(丽江高美古天文观测站和澄江抚…

使用通义灵码,参与开源项目全程纪实

作者:shuipin100-34561 背景 缘起 OceanBase。作为一个充满好奇心的 DBA,一直一来想探寻数据库的内部世界。开源为我们这些好奇的猫打开了一扇新世界的大门。OceanBase 作为分布式关系型数据库的排头兵,自然进入了我的优选名单。起初走进了…

ComfyUI中缺失节点安装一点小小注意事项

加载工作流,遇到了红当当的缺失节点警告窗口: 在ComfyUI-Manager点击安装缺失节点,发现竟然弹出4个,而上面告警窗口中只是缺失3个,究竟是怎么回事呢,刚开始接触ComfyUI时,我也是不管3721&#x…

04 面部表情识别:Pytorch实现表情识别-表情数据集训练代码

总目录:人脸检测与表情分类 https://blog.csdn.net/whiffeyf/category_12793480.html 目录 0 相关资料1 面部表情识数据集2 模型下载3 训练0 相关资料 面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码):https://blog.csdn.net/guyuealian/article/details/1…

【c语言数据结构】超详细!模拟实现双向链表(初始化、销毁、头删、尾删、头插、尾插、指定位置插入与删除、查找数据、判断链表是否为空)

特点: 结构:指向前一结点指针数据指向后一结点指针由于循环,尾结点的下一结点next指向头结点(哨兵结点)空的双向链表只有自循环的哨兵结点(头结点) 模拟实现双向链表 LIST.h #define _CRT_…

【WorldView系列卫星】

WorldView系列卫星 WorldView系列卫星是美国DigitalGlobe公司推出的一系列先进商业遥感卫星,旨在提供高分辨率的地球成像服务。该系列卫星以其卓越的成像能力,如高分辨率、快速重访时间和宽幅扫描能力,引领了地球观测技术的新标准。以下是对…

最新版C/C++通过CLion2024进行Linux远程开发保姆级教学

目前来说,对Linux远程开发支持相对比较好的也就是Clion和VSCode了,这两个其实对于C和C语言开发都很友好,大可不必过于纠结使用那个,至于VS和QtCreator,前者太过重量级了,后者更是不用说,主要用于…

110Redis 简明教程--Redis 数据类型

Redis strings 字符串是一种最基本、最常用的 Redis 值类型。 Redis 字符串是二进制安全的,这意味着一个 Redis 字符串能包含任意类型的数据,例如: 一张经过 base64 编码的图片或者一个序列化的 Ruby 对象。通过这样的方式,Redis …

双亲委派机制SPI

SPI如何破坏双亲委派机制?可根据以下概念一步步深入 什么是双亲委派机制? 双亲委派机制是Java类加载器体系中采用的一种类加载策略,旨在保证类加载的安全性和稳定性。 这一机制规定了类加载的顺序和规则,即当一个类加载器收到类…

创建单链表

一、完成单链表操作,要求节点构造类型。 1、建立学生结构体(学号,姓名,成绩) 2、循环调用头插法创建整表 3、遍历单链表 4、任意位置插入一个完整的学生信息 5、任意位置删除一个学生。 6、单链表逆置 7、单链表按照学…

SpringBoot框架在文档管理中的创新应用

第3章 系统分析 3.1 需求分析 在线文档管理系统主要是为了提高工作人员的工作效率和更方便快捷的满足员工,更好存储所有数据信息及快速方便的检索功能,对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑员工的可操作性,遵循…

ELK-03-skywalking监控linux系统

文章目录 前言一、下载node_exporter二、启动node_exporter三、下载OpenTelemetry Collector四、启动OpenTelemetry Collector4.1 将配置文件下载到同级目录4.2 启动 五、查看总结 前言 skywalking安装完成后,开始我们的第一个监控-监控linux系统。 参考官方文档&a…

最古早的linux发行版,已发行30年!!

最古早的linux发行版,已发行30年!! 当谈到 Linux 发行版时,大多数人首先想到的可能是像 Ubuntu、Fedora 或 CentOS 这样的知名发行版。然而,在 Linux 的世界中,还有一款古老而稳定的发行版,它以…

SIGformer: Sign-aware Graph Transformer for Recommendation---论文学习笔记

SIGIR 2024 用于推荐的符号感知图像转换器 摘要 在推荐系统中,大多数基于图的方法主要关注用户的正面反馈,而忽视了负面反馈的价值。而将正负反馈结合起来形成符号图可以更全面地理解用户偏好。然而,现有的尝试整合这俩种类型反馈的方法很…