分布式事务详解

发布时间 2023-09-27 15:42:12作者: hwj7

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模式的分布式事务