一、分布式事务介绍
1.事务定义
事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销。
数据库事务有四大特性:
-
A(Atomic):原子性,一个事务中的所有操作,要么全部执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。
-
C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。一旦所有事务动作完成,事务就被提交,数据和资源处于一种满足业务规则的一致性状态中。比如我向朋友转账100元,我这边扣除了100,而朋友增加了100,这就称为一致性。
-
I(Isolation):隔离性,数据库中的事务一般都是并发的,隔离性是指并发的两个事务互不干扰,一个事务不能看到其他事务运行过程的中间状态,通过配置事务隔离级别可以避免在脏读、幻读、不可重复读等问题。
-
D(Durability):持久性,事务完成之后,该事务对数据的更改会持久化到数据库中,并且不会被回滚
2.单体应用中的本地事务
假设有一个传统的单体应用程序,有一个业务调用了三个模块,这些模块都使用同一个数据源,这是靠数据库提供的本地事务来保证事务一致性。
数据库事务在实现时会将一次事务涉及的所有操作全部纳入到一个不可分割的执行单元,该执行单元中的所有操作要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务的回滚。
随着业务变得越来越复杂,单体应用自然而然的也出现了各种各样的问题:复杂性高,部署频率低,可靠性差,扩展能力受限等,让单体系统也逐渐淡出人们的视角。
3.微服务中的分布式事务
微服务架构将传统的单体拆分成多个服务,然后多个服务之间相互配合,来完成业务需求。微服务架构带来了太多太多的优点:易于开发、扩展、理解和维护,不会受限于任何技术栈,易于和第三方应用系统集成等。
上面例子中,在微服务架构中设计为三个独立的微服务,各自有自己的数据源,调用逻辑就变为:
每个微服务内部可以使用数据库的本地事务来保证事务的一致性,但是这个业务逻辑会调用多个微服务来实现,如何在多个微服务之间实现分布式事务呢?
简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。
在微服务架构中由于全局数据一致性没法保证而产生的问题就是分布式事务问题。简单来说,一次业务操作需要操作多个数据源或需要进行远程调用,就会产生分布式事务问题。
二、分布式事务解决方案
1.Seata简介
Seata(Simple Extensible Autonomous Transaction Architecture)是阿里巴巴开源的一款分布式事务中间件,致力于提供高性能和简单易用的分布式事务服务,解决微服务场景下面临的分布式事务问题。
Seata的设计目标是对业务无侵入,因此从业务无侵入的2PC方案着手,在传统2PC的基础上演进。它把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致,要么一起成功提交,要么一起失败回滚。通常分支事务本身就是一个关系数据库的本地事务。
2.分布式事务标准化
Seata框架的应用模式为客户端-服务器模式,其对分布式事务的处理过程涉及三个组件:
分布式事务标准模型有三个主要组成模块:
-
Transaction Manager(TM)事务管理器。控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
-
Transaction Coordinator(TC) 事务协调器。维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
-
Resource Manager(RM) 资源管理器。控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
3.分布式事务模型
Seata为用户提供了AT、TCC、SAGA和XA事务模式,打造一站式的分布式解决方案。
AT模式是一种无侵入的分布式事务解决方案。用户只需关注自己的“业务SQL”,用户的“业务SQL”作为一阶段执行,Seata框架会自动生成事务的二阶段提交和回滚操作。
AT模式的要求:
(1)数据库一定要支持本地事务——几乎是所有事务模式的基础。
(2)数据表一定要定义主键——考虑到事务的隔离性,AT里面很有用。
AT模式的执行流程如下:
(1)TM向TC申请开启一个全局事务,TC创建全局事务后返回全局唯一XID。
(2)这个XID通过微服务调用链进行传播
(3)RM把本地事务向TC注册为作为XID关联的全局事务的分支事务。
(4)TM向TC发起全局事务的提交或回滚。
(5)TC调度与XID全局事务关联的所有分支事务来完成提交或者回滚。
4.微服务中分布式事务的实现
Seata通过Transaction Manager(TM)、Transaction Coordinator(TC)和Resource Manager(RM)来实现分布式事务。所有微服务纳入分布式事务管理,只有所有微服务执行成功,整个业务才会执行成功,分布式事务就会被提交;如果任何一个微服务执行失败,都会导致所有微服务执行分布式事务的回滚。