分布式事务是指在分布式系统中,涉及多个节点或服务之间的数据操作,需要保证这些操作要么全部成功提交,要么全部失败回滚,以维持数据的一致性和完整性。以下是一些常见分布式事务原理的介绍:
两阶段提交(2PC)
- 准备阶段:协调者向所有参与者发送事务请求,参与者执行事务操作,但不提交。然后参与者将操作结果反馈给协调者,如果参与者执行成功则返回 Yes,否则返回 No。
- 提交阶段:如果协调者收到所有参与者都返回 Yes,那么它向所有参与者发送提交请求,参与者收到后正式提交事务;如果协调者收到有参与者返回 No 或者超时未收到所有参与者的反馈,就向所有参与者发送回滚请求,参与者回滚事务到初始状态。
三阶段提交(3PC)
- CanCommit 阶段:协调者向参与者发送 CanCommit 请求,询问是否可以执行事务操作。参与者检查自身状态,如果可以执行则返回 Yes,否则返回 No。
- PreCommit 阶段:若协调者收到所有参与者的 CanCommit 响应都为 Yes,则进入 PreCommit 阶段,向参与者发送 PreCommit 请求,参与者执行事务操作,但不提交,并返回执行结果。
- DoCommit 阶段:如果协调者收到所有参与者的 PreCommit 返回都成功,就向参与者发送 DoCommit 请求,让参与者提交事务;如果有任何一个参与者返回失败或超时,协调者发送 Abort 请求,让参与者回滚事务。
TCC(Try-Confirm-Cancel)
- Try 阶段:尝试执行业务操作,完成所有业务检查,预留业务资源,但不真正提交事务。
- Confirm 阶段:在 Try 阶段所有参与者都成功的情况下,执行真正的业务提交操作,提交在 Try 阶段预留的资源。通常要求这个阶段的操作是幂等的,即多次执行的结果与执行一次的结果相同。
- Cancel 阶段:如果 Try 阶段有参与者失败,或者整体事务需要回滚,执行 Cancel 操作,释放 Try 阶段预留的资源,回滚已经执行的部分操作,使系统恢复到事务执行前的状态。
消息队列(MQ)
- 本地事务与消息发送:在生产者端,将业务操作和消息发送放在一个本地事务中。先执行本地业务操作,成功后再向消息队列发送消息。如果消息发送失败,可以通过事务回滚来保证数据一致性。
- 消息消费与业务处理:消费者从消息队列中获取消息,然后执行相应的业务操作。如果业务操作失败,可以根据具体情况进行重试或者进行补偿操作。为了保证消息不被重复消费导致数据不一致,通常需要在消费者端实现幂等性处理。
分布式事务框架原理
分布式事务框架通常会基于上述一种或多种原理来实现,比如 Seata 框架,它融合了多种技术来提供分布式事务解决方案:
- AT 模式:基于两阶段提交思想,对数据进行解析和代理,在一阶段对业务数据进行隐藏式的保存,二阶段根据事务结果进行提交或回滚。
- TCC 模式:与标准的 TCC 原理一致,框架负责协调各个服务的 Try、Confirm、Cancel 操作,保证事务的一致性。
- Saga 模式:将长事务拆分成多个本地短事务,通过消息驱动来依次执行这些子事务。如果某个子事务失败,会根据事先定义好的补偿策略来执行补偿操作,以达到数据最终一致性。