首页 > 其他分享 >分布式事务详解

分布式事务详解

时间:2023-09-27 15:45:17浏览次数:58  
标签:事务 Seata 数据库 模式 详解 一致性 分布式

1、分布式事务

传统数据库事务

事务特性:ACID

1、原子性:事务中的所有操作,要么全部成功,要么全部失败,影响事务的操作,一般指的是增删改,也就是一个事务中,有多个增删改的SQL

2、一致性:事务开始前到事务结束后,数据状态需要一致。这意味着事务中的操作必须满足数据库定义的所有约束和规则,包括完整性约束、外键约束等。如果事务执行成功,数据库将会从一个一致的状态转移到另一个一致的状态。

3、隔离性:多个事务之间的操作相互隔离,互不影响。每个事务都应该感觉自己在独立地操作数据库,即使多个事务同时执行,它们也不应该相互影响。隔离级别是控制事务隔离性的一个重要概念,常见的隔离级别有读未提交、读已提交、可重复读和串行化。

不同的隔离级别会产生不同的问题:脏读一个事务读到了另一个事务没有提交的数据;不可重复读:同一个事务中,连续读取两次,得到结果不一样;幻读:事务操作看到前和看到后的结果不一致,就像出现了幻觉一样。

读未提交会产生脏读、幻读、不可重复读的问题;读已提交会产生幻读、不可重复读的问题;可重复读会产生幻读的问题;串行化没有任何问题,但是相当于锁表,效率极低。所以这种方案不用

4、持久性:事务一旦提交,则永久的保存到磁盘,不可逆

事务控制:

JDBC通过Connection控制事务,Mybatis通过SqlSession控制事务,Spring则是基于运行时异常的声明式事务

 

分布式事务

微服务架构是基于分布式架构的,所以在微服务项目或者分布式环境下出现的事务就是分布式事务。

在微服务项目中无论是多服务多数据库,还是多服务但数据库,在操作数据库的时候不同的服务都是使用自己独立的数据库连接的,会出现几个服务成功,但是某个服务失败,回滚数据时,如果是传统的数据库事务,是无法做到将所有的服务数据回滚的,因此需要用到分布式事务。

分布式事务分为两种,刚性事务和柔性事务,刚性事务要求强一致性,数据需要高度一致,而柔性事务则要求最终一致性,有时间弹性,柔性会失误在互联网应用中更为广泛,比如订单以及扣减库存的操作下完订单以后,扣减库存的操作不需要立即实现,允许有一定的时间误差。

 

2、分布式理论

CAP定理:

CAP定理代表分布式系统架构下的三个指标,Consistency(一致性),Availability(可用性),Partition tolerance (分区容错性)。

在分布式架构中最重要的就是P分区容错性,网络是不可靠的,没有办法避免网络的问题,当网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区,在集群出现分区时,整个系统也要持续对外提供服务,容忍出现分区的问题。

由于CAP三个指标只能保证其二,所以AC只能保证一个,这个时候就需要根据具体的业务需求来决定保证A还是C了。A代表可用性,用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝,C代表一致性,用户访问分布式系统中的任意节点,得到的数据必须一致。

如果保证AP,那么这个服务在任何时间内,都对外访问,但是得到的数据可能不一样,如果保证CP,那么服务在一定时间内,等待集群节点进行数据同步后,再对外提供访问。

BASE理论:

BASE理论是对CAP的一种补充,放弃强一致性,追求最终一致性。

他有三个思想,第一个是基本可用:分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。譬如电商大促,为了应对大流量,暂时停止注册服务,这时注册服务就不可用,但是整个系统是可用的,所以叫基本可用;第二个是软状态:在一定时间内,系统中的状态可以是不一致的,即系统的状态可以随时间而变化。这是因为分布式系统中的各个组件可能存在网络延迟、消息丢失等问题,导致系统的状态不一致。因此,BASE理论允许系统在一段时间内处于不一致的状态;第三个是最终一致性:系统中的数据副本在一段时间内可以是不一致的,但最终会达到一致性。分布式系统中的数据复制和同步存在延迟和不确定性,因此无法保证数据的实时一致性。BASE理论通过强调最终一致性来解决这个问题,即系统会在一段时间内自动调整和同步数据副本,最终达到一致的状态。

 

3、Seata

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

Seata架构

Seata的架构分为TC、TM、RM三部分。

TC是事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚,监控和通知各个事务,包括分支事务和全局事务;

TM是事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务;

RM是资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

支持的模式

Seata将提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

XA模式:Seata会与数据库的XA事务协调器进行交互,来实现分布式事务的提交和回滚。优点:事务的强一致性,满足ACID原则;常用数据库都支持,实现简单,并且没有代码侵入。缺点:因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差;依赖关系型数据库实现事务。

AT模式:AT模式是Seata默认的事务模式,也是最常用的模式。在AT模式下,Seata通过在业务代码中嵌入事务注解的方式来实现分布式事务。Seata会拦截被注解标记的方法,并在事务开始和结束时进行事务的管理和协调。在AT模式下,Seata通过对每个分支事务的undo和redo操作来实现事务的回滚和提交。优点:不会死锁,保证最终一致性。

SAGA模式:SAGA模式是一种长事务模式,适用于业务流程较复杂的场景。在SAGA模式中,每个分支事务都是独立的,通过发送消息来触发下一个分支事务的执行。Seata通过Saga模式的状态机和补偿事务日志来实现SAGA模式的分布式事务。

TCC模式:TCC模式是一种补偿型的分布式事务模式。在TCC模式中,要手写补偿代码,业务代码需要实现try、confirm和cancel三个阶段的逻辑。在try阶段,业务代码会尝试执行分支事务;在confirm阶段,业务代码确认执行分支事务;在cancel阶段,业务代码撤销之前执行的分支事务。Seata通过TCC接口和补偿事务日志来实现TCC模式的分布式事务

标签:事务,Seata,数据库,模式,详解,一致性,分布式
From: https://www.cnblogs.com/hwj7/p/17732871.html

相关文章

  • 【从0学习Solidity】 3. 函数详解
    【从0学习Solidity】3.函数详解博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代......
  • 分布式事务
    分布式事务传统数据库事务一,什么是事务事务是指单个逻辑工作单元执行得一系列操作,要么都做,要么都不做,是不可分割的工作单位,是数据库环境中的的最小工作单元二、为什么需要事务?事务包含了一组操作,这些操作可以是一条SQL语句、一组SQL语句或整个程序。如果其中一个操作不成功,......
  • 科技云报道:分布式存储红海中,看天翼云HBlock如何突围?
    过去十年,随着技术的颠覆性创新和新应用场景的大量涌现,企业IT架构出现了稳态和敏态的混合化趋势。在持续产生海量数据的同时,这些新应用、新场景在基础设施层也普遍基于敏态的分布式架构构建,从而对存储技术提出了新的要求。正因如此,分布式存储凭借高安全性、可靠性、可用性、易于扩展......
  • c#装饰器模式详解
    基础介绍:  动态地给一个对象添加一些额外的职责。适用于需要扩展一个类的功能,或给一个类添加多个变化的情况。  装饰器,顾名思义就是在原有基础上添加一些功能。  大家都只知道如果想单纯的给原有类增加一些功能,可以直接继续该类生成一个子类就可以。  举个例子,如果现......
  • 接口自动化--postman(3)高级用法,断言详解
    postman断言的流程①在postman的tests页签中截取要对比的响应信息;②利用断言语句tests[]或chai.js形式把实际响应信息与期望结果对比;③执行请求进行结果查看;二、Postman断言的语法1、语法一:tests[‘测试用例名称’]=逻辑表达式; ......
  • POSIX 详解
    目录编写跨平台应用需要考虑的问题POSIX是什么,为什么需要POSIXPOSIX线程常用API介绍1、POSIX线程库2、创建线程pthread_create3、pthread_self4、线程等待pthread_join(主线程等待新线程)线程终止的方案pthread_exit函数pthread_cancel函数线程分离pthread_detach函数pthread中的线......
  • 分布式事务
    分布式事务  事务在逻辑上是的一组操作,要么都执行,要么都不执行,事务有四个特点也就是常说的ACID,A代表原子性,是最小事务的执行单位,不允许分割。原子性确保动作要么全部完成,要么完全不起作用;C代表一致性,执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的,I代表隔......
  • 传统事务,分布式事务分析
    这里先抛出一个问题:什么是事务?什么是分布式事务?由于隔离机制做的不恰当,在并发事务操作中我们经常会遇见的三个问题(1)脏读(DirtyRead):脏读是指一个事务在读取了另一个事务未提交的数据时发生的情况。假设事务A更新一个数据,但是还没有提交,事务B读取了这个未提交的数据,然后事务A回滚......
  • 测试驱动技术(TDD)系列之3:详解Java数组
    在前面的文章中我介绍了如何通过junit4和TestNG实现参数化,这两种架构都通过二维数组来实现参数化,在这里我就给大家详细的介绍一下java数组。Junit4定义参数化数据,代码如下:publicstaticCollectionprepareData(){Object[][]object={{1,2,3},{0,2,2},{0,3,3}};returnArrays.as......
  • 测试驱动技术(TDD)系列之2:详解TestNG参数化
    上一篇文章介绍了测试驱动的相关概念,并以junit4为例,带大家了解如何在测试框架中实现测试驱动。详情:测试驱动技术(TDD)系列之1:一文带你上手测试数据驱动大家会发现Junit4在同一个测试类中实现多组数据的数据驱动,不是很方便,需要我们自己解决!我也说过在TestNG中这个问题很容易搞定!给自己......