分布式事务解决方案概览
分布式事务产生的原因
这里再次说明一下,分布式事务这个问题并不是微服务架构中才出现的问题,而是分布式系统下很容易出现的事务问题,微服务架构只是分布式技术中的一种架构。在分布式场景中,要完成一个功能可能涉及多个数据库或多个服务,也就会牵涉跨数据库的事务操作。
比如,一个应用中的某个业务方法需要操作多个数据库中的多张表,此时就出现了跨数据库的事务问题,如图 10-11 所示。
如果系统拆分时做了分库分表的操作,那么这种情况下也极有可能出现跨数据库的事务问题,如图 10-12 所示。
在微服务架构下,各个服务都有自己独立的数据库系统。如果一个功能的实现过程中需要涉及多个服务,就会出现跨服务、跨数据库的事务问题。比如,生成订单时需要订单服务、商品服务和购物车服务,各自的数据库是独立的,跨数据库的事务问题就出现了,如图 10-13 所示。



在上述跨数据库、跨分区、跨服务的情况下,要保证一个方法中的SQL操作全部成功或全部失败,有些复杂。
分布式事务的解决方案
当然,分布式事务问题存在已久,业内有很多分布式事务问题的解决方案,如常见的二阶段提交(2PC
)、三阶段提交(3PC
)、TCC
方案和最终一致性方案。由于篇幅限制,这里就不进行拓展了,读者可以自行搜索上述关键词进行学习。这些方案都是实现原理,算是一种顶层设计,要想实际地应用到项目中,就需要使用这些方案所对应的软件产品。在 Java
开源领域能够提供分布式事务解决方案的软件中,比较有代表性的有 Sharding JDBC
、Atomikos
、MyCat
、Alibaba Seata
等。
在这些落地方案中,不管是基于长事务的方案还是基于消息通知的方案,都是对跨数据库事务的进一步抽象,形成一个新的事务概念。在未加入分布式事务方案时,跨数据库的事务一致性问题是无法解决的,因为每个数据库都是独立的,其中的事务管理器也是独立的,互不干涉、互不影响。而上述这些分布式事务解决方案,在数据库之外引入了一个新的角色,对整个流程进行进一步的抽象,在其中加入了一个协调者(管理者),此时就存在一个第三方的管理者来协调多个数据库事务,如图 10-14 所示。
在本书中,笔者选择使用 Alibaba Seata
作为解决分布式事务问题的组件,从技术支持、成熟度、社区活跃度等角度综合来看,Alibaba Seata
都是非常优秀的分布式事务中间件。本章后续内容都将围绕 Seata
组件来讲解,包括 Seata
的介绍、搭建和实际编码,以便解决分布式事务问题。
以 Seata
组件为例,它就是一个跨数据库事务的第三方 “管理者”,把跨数据库、跨服务的分布式事务场景变成了一个拥有多个分支事务的全局事务,如图 10-15 所示。通俗一些来说,就是用一条虚拟的绳子把原本独立的本地事务串联了起来,让这些跨数据库的本地事务变成了 “一根绳上的蚂蚱”。


这样做的目的是解决分布式事务场景下的数据一致性问题,让全局事务下的分支事务要么全部成功,要么全部失败。所以,Alibaba Seata
中间件对跨多数据库的多个独立事务做了进一步的抽象,形成了全局事务的概念,如图 10-16 所示。

以前文中的 saveOrder()
方法举例,订单的 SQL
操作、购物车的 SQL
操作和商品的 SQL
操作都是在各自的数据库中进行的,如果不加入分布式事务组件,则数据一致性不能完全保证。而加入分布式事务组件后,saveOrder()
方法操作下的所有跨数据库的事务就会被抽象为一个全局事务 S,订单事务被抽象为分支事务 branch-o
,购物车事务被抽象为分支事务 branch-s
,商品服务事务被抽象为分支事务 branch-g
。在分布式事务组件的协调下,全局事务 S 下的 branch-o
、branch-s
、branch-g
要么全部成功,此时生成一条订单数据、购物车数据被删除、商品库存被扣减,要么全部失败,此时不会生成新的订单数据、购物车数据不会被删除、商品库存不变。
只有所有的分支事务都成功了,全局事务才算成功(Commit
)。只要有一个分支事务失败了,全部分支事务就失败,所有的分支事务都会回滚(Rollback
)。更进一步理解,加入全局事务的概念和技术实现后,所有跨数据库的本地事务都成为全局事务中的一个分支,在全局事务管理器的协调下,所有本地事务(分支事务)中执行的 SQL
语句,要么全部都执行,要么全部都不执行。
Alibaba Seata 简介
Seata
是一个开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。Seata
为用户提供了 AT
、TCC
、SAGA
和 XA
事务模式,为用户打造一站式的分布式解决方案,官网页面如图 10-17 所示。

在 Seata
开源之前,其内部版本在阿里巴巴经济体内部一直扮演着应用架构层数据一致性的中间件角色,帮助经济体平稳地度过历年的 “双11”,对上层业务进行了有力的技术支撑。经过多年沉淀与积累,Seata
于 2019 年 1 月正式对外开源,并以社区共建的形式帮助用户快速落地分布式事务解决方案。