一、事务概念回顾
事务定义:事务是并发控制的单位,业务定义的一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
本地事务:本地事务是指仅操作单一事务资源的、不需要全局事务管理器进行协调的事务,也称为数据库事务或传统事务。
分布式事务: 随着SOA架构、微服务的流行,以及业务复杂后进行服务化拆分,数据库垂直拆分后会有多实例库的事务需求,会出现对应的分布式事务。
定义:分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上
场景:
1、 跨数据库实例 2、 跨服务 3、 混合式分布式事务
二、分布式事务问题
场景:调用其他的服务,需要判断返回状态后在执行后续的逻辑、一个服务操作了多个数据源的场景
问题:单靠业务逻辑判断或者补偿会非常复杂,几乎无法保证事务的基本语义和基本特性
三、解决方案概览
-
二阶段提交
2PC,Two-phase commit protocol,即两阶段提交协议。它引入了一个事务协调者角色,来管理各个参与者(就是各数据库资源)
问题:
a 同步阻塞 :二阶段提交过程中,所有参与事务操作的节点处于同步阻塞状态,无法进行其他的操作
b 单点问题:协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作
c 数据不一致:如果分布式节点出现网络分区,某些参与者未收到命令,出现数据不一致 -
三阶段提交
3PC 把 2PC 的准备阶段再次一分为二,这样三阶段提交就有 CanCommit、PreCommit、DoCommit 三个阶段
改进:1 将prepare拆分成cancommit和precommit,减少资源浪费 2 引入超时机制。同时在协调者和参与者中都引入超时机制,等待超时后,继续commit
问题:仍然无法解决数据一致性问题
- 其他方案
3.1.TCC 补偿型事务:TCC(Try、Confirm、Cancel)是两阶段提交的一个变种
3.2.基于消息的分布式事务
3.3.开源方案 Seata:http://seata.io/zh-cn
4 开源方案seata
Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案