1.分布式事务理论基础
1.1.本地事务
本地事务,也就是传统的单机事务,在传统的数据库事务中,必须要满足ACID四个原则:
1.2.分布式事务
分布式事务,就是指不是在单个服务或单个数据库架构下产生的事务。
- 分布式事务是指涉及多个独立系统或服务的事务处理,在分布式系统中,不同的服务或应用程序可能被部署在不同的服务器上,这些服务需要协同工作来完成一个事务,事务的每个操作步骤都位于不同的节点上,需要保证事务的ACID与特性。
- 在传统的单机环境下,事务处理通常由单一的事务管理器(Transaction Manager)来管理,保证事务的原子性、一致性、隔离性和持久性(ACID),但在分布式系统中,由于存在网络延迟、节点故障等问题,事务处理变得更加困难。
每个微服务的本地事务,也可以称为分支事务,每一个分支事务就是传统的单体事务,多个有关联的分支事务一起就组成了全局事务,但全局事务跨多个服务、跨多个数据库,因此全局事务,即分布式事务并未遵循ACID的原则,归其原因就是参与事务的多个子业务在不同的微服务中,跨越了不同的数据库,虽然每个单独的业务都能在本地遵循ACID,但是它们互相之间没有感知,不知道有人失败了,无法保证最终结果的统一,也就无法遵循ACID的事务特性了,所以,我们必须保证整个全局事务同时成功或失败。
哪些场景会产生分布式事务?
1. 跨数据源或跨数据库实例的分布式事务
比如有以下两个场景:
- 单体系统下,同一个系统使用了多个数据库源连接不同的数据库
- 分布式、微服务系统,各系统服务使用不同的数据库
2. 跨服务,即跨JVM进程的分布式事务
- 分布式、微服务系统,各系统服务使用不同的数据库或者是同一个数据库,都会产生分布式事务,因为它们使用的是不同的数据库连接和事务管理器
单体系统会产生分布式事务问题吗?
- 会,如果一个单体系统使用了多个数据源连接不同的数据库,也会产生分布式事务问题。
只有一个库,会产生分布式事务问题吗?
- 分布式、微服务系统,各系统服务使用不同的数据库,或者是同一个数据库,都会产生分布式事务,因为它们使用的是不同的数据库连接和事务管理器。
分布式事务举例
- 在数据库水平拆分、服务垂直拆分之后,一个业务操作通常要跨多个数据库、服务才能完成。
例如电商行业中比较常见的下单付款业务的整体流程,包括下面几个行为: