一文搞懂分布式事务-Saga

2024-06-01 00:36

本文主要是介绍一文搞懂分布式事务-Saga,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Saga定义

Saga模式是一种分布式事务处理模式,用于保证分布式系统中的一系列操作要么全部成功执行,要么全部回滚,以实现一致性的目标。它采用了长事务的概念,将原子操作拆分为多个子事务,并通过补偿机制保证整个事务的一致性。

Saga是一种比较传统的解决方案,传统的业务系统中通常会提供冲正服务,当正向服务执行失败时,业务会自动调用冲正服务,将已经发生变化的数据再修改回去,这种解决思想与Saga相同。

Saga组成

Saga由一个个独立的本地事务组成(T1,T2,T3...),并且每个独立的本地事务提供反向逻辑(C1,C2,C3...),反向逻辑是指正向节点发生的变化会滚回去,如T1将数据ID=1 变更为ID=2,则反向逻辑是将ID变更为ID=1

T3节点执行失败,则开始执行冲正服务C2->C1。

Saga隔离性问题

事务隔离性

事务隔离性(Isolation)指的是一个事务的执行过程不会被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的。这意味着并发执行的各个事务之间不能互相干扰,每个事务都独立地在自己的工作空间内完成,并且其结果在事务未提交之前对其他事务是不可见的。

事务隔离级别

事务隔离级别存在以下四种

  1. 读已提交

    • 事务内读取的是别的事务已经提交的数据,能够防止脏读,但是无法限制不可重复读和幻读。

  2. 读未提交

    • 能够读取到没有被提交的数据,这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种。

  3. 可重复读

    • Mysql数据库默认隔离级别,一个事务内支持多次读取相同的数据,即第一次读取和第二次读取相同。

  4. 串行化

    • 最严格的隔离级别,操作相同的数据全部加锁以串行的方式执行,数据安全性最高,但是性能上有严重的不足。

Saga隔离性

Saga这种模式对隔离性没有处理,每个本地事务提交,影响的数据对其他事务可见,如下场景

当Saga1流程中的T1执行成功后,本地事务提交,此时执行Saga2流程对ID=1的数据进行了更新ID=2,当Saga1流程执行T2失败后,调用C1进行冲正,此时如何处理?如果直接将ID更新为1,则丢失其他事务修改后的数据。

Saga隔离性问题处理

  1. 第一种解决思路

    • 如果开发过程中分析业务场景可能存在这种问题,流程执行过程中记录为特殊节点,特殊节点执行过后不允许执行冲正执行,重试正向服务中的节点,这样即使数据被其他事务修改,也无影响。

  1. 第二种解决思路

    • 通过分布式锁解决,事务执行前对操作的数据进行加锁,节点T执行成功后不释放锁,需要等待Saga流程全部执行结束后释放锁,这种方案存在明显的问题的是降低了并发能力,因为锁的持有时间是与整个Saga流程时间相同。

这篇关于一文搞懂分布式事务-Saga的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019494

相关文章

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

一文彻底搞懂Java 中的 SPI 是什么

《一文彻底搞懂Java中的SPI是什么》:本文主要介绍Java中的SPI是什么,本篇文章将通过经典题目、实战解析和面试官视角,帮助你从容应对“SPI”相关问题,赢得技术面试的加分项,需要的朋... 目录一、面试主题概述二、高频面试题汇总三、重点题目详解✅ 面试题1:Java 的 SPI 是什么?如何实现一个

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI