一文搞懂分布式事务-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中使用Requests库

《一文详解如何在Python中使用Requests库》:本文主要介绍如何在Python中使用Requests库的相关资料,Requests库是Python中常用的第三方库,用于简化HTTP请求的发... 目录前言1. 安装Requests库2. 发起GET请求3. 发送带有查询参数的GET请求4. 发起PO

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

MYSQL事务死锁问题排查及解决方案

《MYSQL事务死锁问题排查及解决方案》:本文主要介绍Java服务报错日志的情况,并通过一系列排查和优化措施,最终发现并解决了服务假死的问题,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录问题现象推测 1 - 客户端无错误重试配置推测 2 - 客户端超时时间过短推测 3 - mysql 版本问

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求