分布式事务的几种方式 2PC,3PC,Distributed Lock,TCC

分布式事务是一种确保在多个分布式系统或服务中操作的一致性和可靠性的机制。实现分布式事务的方式有很多,以下是其中一种常见的实现方式——两阶段提交(Two-Phase Commit, 2PC)。

两阶段提交(2PC)

  1. 概述

两阶段提交协议是一种经典的分布式事务协议,用于确保所有参与者在分布式系统中的一致性。其主要目标是确保在所有参与节点上成功提交事务,或在出现故障时保证事务的回滚。

  1. 阶段
    第一阶段:准备阶段(Prepare Phase)
    协调者请求准备:协调者(Coordinator)向所有参与者(Participants)发送准备请求,询问它们是否可以提交事务。
    参与者响应:
    每个参与者在收到请求后,执行本地事务操作并锁定相关资源,然后向协调者回复“准备好”(Ready)或“无法准备”(Not Ready)。
    如果参与者回复“准备好”,它会暂时保留事务的所有状态;如果无法准备,则会中止事务。
    第二阶段:提交阶段(Commit Phase)
    协调者决定:
    如果所有参与者都回复“准备好”,协调者向所有参与者发送提交请求(Commit),要求它们正式提交事务。
    如果有任何参与者回复“无法准备”,协调者会发送回滚请求(Rollback),要求所有参与者撤销之前的操作。
    参与者执行:
    接收到提交请求的参与者将正式提交事务。
    接收到回滚请求的参与者将撤销之前的操作并释放资源。
  2. 优点
    一致性:确保所有参与者在事务提交时保持一致性。
    简单性:实现相对简单,易于理解和应用。
  3. 缺点
    阻塞:如果协调者在第一阶段或第二阶段失败,可能导致参与者阻塞,无法继续操作。
    性能问题:在高延迟网络中,可能会影响系统的性能。
    单点故障:协调者成为单点故障,可能导致系统的可用性降低。
  4. 应用场景
    适用于需要强一致性的场景,如金融系统中的资金转账、库存管理等。

两阶段提交(2PC)是实现分布式事务的一种经典方法,虽然它提供了一致性保障,但在性能和可用性方面存在一些限制。理解 2PC 的工作原理是深入了解分布式系统事务管理的基础。

除了经典的两阶段提交(2PC)外,以下是一些其他常见的实现方式:

1. 三阶段提交(3PC)
概述:三阶段提交协议在两阶段提交的基础上增加了一个阶段,以减少阻塞的可能性。
阶段:
准备阶段:协调者询问参与者是否可以准备提交。
预提交阶段:参与者在本地准备好但尚未提交,回复“预备完成”。
提交阶段:协调者根据参与者的响应决定是否提交或回滚。
优点:通过增加预提交阶段,减少了参与者的阻塞时间。
缺点:相对于 2PC,复杂性增加,可能导致性能开销。
2. 补偿事务(Saga)
概述:Saga 通过将长事务拆分为一系列短事务,并为每个短事务定义补偿操作来实现最终一致性。
实施方式:
每个子事务在完成后都会立即提交。
如果某个子事务失败,则调用补偿操作来撤销之前已成功的子事务。
优点:避免了长时间锁定资源,易于实现,适合长事务。
缺点:需要定义补偿逻辑,可能导致复杂性增加。
3. 最终一致性(Eventual Consistency)
概述:在某些应用场景中,可以接受最终一致性,而不是强一致性。
实施方式:
通过异步消息传递、事件驱动架构等方式,允许数据在不同节点之间最终达到一致。
优点:提高系统的可用性和性能,适合高并发场景。
缺点:在某些情况下,数据在短时间内可能会不一致。
4. 分布式锁(Distributed Lock)
概述:通过分布式锁机制来管理对共享资源的访问,从而保证事务的一致性。
实施方式:使用如 Zookeeper、Redis 等工具实现分布式锁,确保同一时间只有一个事务可以访问资源。
优点:相对简单,适用于需要强一致性的场景。
缺点:可能导致性能瓶颈和死锁问题。
5. TCC(Try-Confirm-Cancel)
概述:一种业务流程控制机制,将事务分为三部分:尝试、确认和取消。
实施方式:
Try:执行事务的尝试操作,预留资源。
Confirm:确认操作,正式提交。
Cancel:取消操作,释放资源。
优点:提供了较好的灵活性和控制力,适合复杂业务场景。
缺点:需要实现确认和取消逻辑,复杂性较高。
6. 基于消息队列的事务(Transactional Outbox)
概述:将事务操作和消息发送的过程耦合,通过消息队列确保消息的可靠传递。
实施方式:
在数据库操作的同时,将需要发送的消息存储到一个“出箱”表中。
后台进程负责将消息从出箱表发送到消息队列。
优点:提高了系统的可靠性,适合异步处理场景。
缺点:实现复杂,可能需要额外的管理。

以上是分布式事务的几种常见实现方式。每种方法都有其优缺点,适用于不同的场景。选择合适的分布式事务方案需要根据具体需求、系统架构和业务逻辑进行权衡。

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

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

相关文章

【xxl-job总结】

文章目录 xxl-job介绍系统组成为什么不使用quartz过期处理策略避免任务重复执行源码分析 xxl-job介绍 XXL-JOB是一个轻量级分布式任务调度平台,它的核心设计目标是开发迅速、学习简单、轻量级、易扩展。 1.简单易用:XXL-JOB提供了友好的Web界面&#xf…

19. 架构重要需求

文章目录 第19章 架构重要需求19.1 从需求文档中收集架构重要需求(ASRs)不要抱太大希望从需求文档中找出架构重要需求 19.2 通过访谈利益相关者收集架构重要需求19.3 通过理解业务目标收集架构重要需求19.4 在效用树中捕获架构重要需求19.5 变化总会发生…

简易CPU设计入门:译码模块(一)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…

Hunyuan-Large:腾讯发布业界参数规模最大的开源 MoE 模型,支持超长文本输入,超越主流开源模型

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

Linux基础

1. openssl passwd -1 密码 128位 openssl passwd -5 密码(更安全)256位 openssl是开源的加密工具包,有各种加密,解密等功能 2. 文件管理 创建空文件 touch newfile 删除文件 rm new file 新建日录 mkdir newdir 删除…

HuggingFace情感分析任务微调

官方教程地址:https://huggingface.co/learn/nlp-course/zh-CN/chapter3/1?fwpt 部分内容参考: 李福林, & 计算机技术. (2023). HuggingFace 自然语言处理详解: 基于 BERT 中文模型的任务实战. 清华大学出版社. HuggingFace将AI项目研发分为四个步骤…

Springboot——对接支付宝实现扫码支付

文章目录 前言官方文档以及说明1、申请沙箱2、进入沙箱获取对应的关键信息3、拿到系统生成的公钥和密钥 注意事项创建springboot项目1、引入依赖2、配置连接参数3、创建配置类,用于接收这些参数4、中间类的定义(订单类)5、编写测试接口场景一、pc端请求后端后&#…

迪杰斯特拉算法

迪杰斯特拉算法 LeetCode 743. 网络延迟时间 https://blog.csdn.net/xiaoxi_hahaha/article/details/110257368 import sysdef dijkstra(graph, source):"""dijkstra算法:param graph: 邻接矩阵:param source: 出发点,源点:return:""&…

STL学习-容器适配器

一.stack栈 1.栈的介绍 stack 栈是一种只在一端(栈顶)进行数据插入(入栈)和删除(出栈)的数据结构,它满足后进 先出(LIFO)的特性。 使用push(入栈)将数据放入stack,使用pop(出栈)将元素从容器中移除。 栈的结构如图&#xff1a; 在头文件<stack>中&#xff0c;class st…

【C语言】动态内存开辟

写在前面 C语言中有不少开辟空间的办法&#xff0c;但是在堆上开辟的方法也就只有动态内存开辟&#xff0c;其访问特性与数组相似&#xff0c;但最大区别是数组是开辟在栈上&#xff0c;而动态内存开辟是开辟在堆上的。这篇笔记就让不才娓娓道来。 PS:本篇没有目录实在抱歉CSD…

海的记忆:海滨学院班级回忆录项目

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【VScode】C/C++多文件夹下、多文件引用、分别编译——仅一个设置【适合新人入手】

【VScode】C/C多文件夹内的多文件引用编译 1、问题2、前提&#xff08;最简环境&#xff09;3、核心&#xff08;关键配置&#xff09;4、成功享用~ 1、问题 在使用 VScode 编写一个简单项目的时候&#xff0c;没有特别配置的情况下&#xff0c;若主文件(.c)引用了自定义的头文…

62 mysql 中 存储引擎MyISAM 中索引的使用

前言 固定数据表 mysql. tables_priv 的表结构创建如下 CREATE TABLE tables_priv (Host char(60) COLLATE utf8_bin NOT NULL DEFAULT ,Db char(64) COLLATE utf8_bin NOT NULL DEFAULT ,User char(32) COLLATE utf8_bin NOT NULL DEFAULT ,Table_name char(64) COLLATE u…

使用buildx构建多架构平台镜像

1. 查看buildx插件信息 比较新的docker-ce版本默认已经集成了buildx插件 [rootdocker ~]# docker buildx version github.com/docker/buildx v0.11.2 9872040 [rootdocker ~]#2. 增加多平台镜像构建支持 通过tonistiigi/binfmt:latest初始化一个基于容器的构建环境&#xff…

数据库基础(3) . Navicat使用

0.下载安装 官网 : https://www.navicat.com.cn/ Navicat 中国 | 支持 MySQL、Redis、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库管理 1.连接数据库 1.1.连接 1.1.1.点击连接 打开navicat 点击 左上角连接 1.1.2.选择MySQL 弹出配置界面 1.1…

MySQL(上)

一、SQL优化 1、如何定位及优化SQL语句的性能问题&#xff1f;创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因&#xff1f; 对于性能比较低的sql语句定位&#xff0c;最重要的也是最有效的方法其实还是看sql的执行计划&#xff0c;而对于mysql来说&a…

国密SM2 非对称加解密前后端工具

1.依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.21</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcpki…

【银河麒麟操作系统】软raid重建速度限制问题分析

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 遇到软raid重建速度问题&#xff0c;分…

ssm教室信息管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 …

去中心化存储:Web3中的数据安全新标准

随着Web3的兴起&#xff0c;去中心化存储逐渐成为数据安全的新标准。传统的中心化存储方式将数据集中保存在少数服务器上&#xff0c;这种模式尽管在早期互联网中被广泛应用&#xff0c;但随着数据量和数据价值的增加&#xff0c;其潜在的安全风险和隐私问题也逐渐暴露。而去中…