分布式事务——两阶段提交、三阶段提交和TCC框架

分布式事务——两阶段提交、三阶段提交和TCC框架
最新回答
纯洁的小黄瓜

2022-06-28 03:39:08

分布式事务——两阶段提交、三阶段提交和TCC框架

一、两阶段提交

两阶段提交(2PC,Two-Phase Commit)是一种用于确保分布式系统中所有节点数据一致性的协议。它分为两个阶段:

  • 阶段一:准备阶段(Prepare Phase)

    事务发起者(协调者)向所有参与者(执行者)发送事务请求,要求它们准备执行事务。

    参与者执行本地事务的准备工作,如锁定资源、检查条件等,并返回准备结果给协调者。

    如果所有参与者都返回成功,则进入阶段二;如果有任何参与者返回失败,则协调者取消事务,并向所有参与者发送取消请求。

  • 阶段二:提交阶段(Commit Phase)

    如果阶段一成功,协调者向所有参与者发送提交请求(Confirm)。

    参与者执行本地事务的提交操作,释放锁定的资源,并返回提交结果给协调者。

    如果协调者在阶段二中没有收到所有参与者的成功确认,或者阶段一中有参与者失败,则协调者需要取消事务(Cancel),并向所有参与者发送取消请求(尽管在阶段一已经失败的参与者无需再次取消)。

超时与异常处理

  • 对于执行者而言,如果没有收到第二阶段的事务请求,可以选择超时后取消事务,以避免长时间锁定资源。
  • 对于协调者而言,如果在第一阶段或第二阶段没有收到所有参与者的回复,可以超时重试或视为失败处理。

问题

  • 两阶段提交存在数据不一致的风险,特别是在网络异常或协调者故障时。
  • 锁定资源降低了并发性能。

二、三阶段提交

三阶段提交(3PC,Three-Phase Commit)是对两阶段提交的改进,通过增加一个准备提交阶段来降低数据不一致的风险。它分为三个阶段:

  • 阶段零:检查阶段(CanCommit Phase)

    协调者向所有参与者发送检查请求,询问它们是否可以提交事务。

    参与者检查本地条件(如资源是否足够),并返回是否可以提交的结果。

  • 阶段一:准备阶段(Prepare Phase)

    如果阶段零成功,协调者向所有参与者发送准备请求,要求它们锁定资源并准备提交。

    参与者执行准备操作,并返回准备结果。

  • 阶段二:提交阶段(Commit Phase)

    如果阶段一成功,协调者向所有参与者发送提交请求(DoCommit)。

    参与者执行提交操作,并返回提交结果。

    如果协调者在阶段二中没有收到所有参与者的成功确认,或者阶段一中有参与者失败,则进入回滚阶段(Rollback),向所有参与者发送回滚请求。

改进

  • 三阶段提交通过检查阶段降低了进入准备阶段后失败的可能性,从而减少了数据不一致的风险。
  • 执行者的默认超时行为从取消改为提交,因为在检查阶段已经确认了可以提交。

问题

  • 尽管三阶段提交降低了数据不一致的风险,但在极端高并发情况下仍有可能出现数据不一致。
  • 仍然存在锁定资源降低并发性能的问题。

三、TCC框架

TCC(Try-Confirm-Cancel)框架是一种分布式事务的实现方式,它要求每个参与者都实现Try、Confirm、Cancel三个操作。

  • Try阶段

    事务管理方向所有参与者发起Try请求,参与者执行本地事务的预备操作,如锁定资源、检查条件等。

    Try操作需要保证幂等性,即多次执行相同操作的结果应该是一致的。

  • Confirm阶段

    如果Try阶段所有参与者都返回成功,事务管理方向所有参与者发起Confirm请求,参与者执行本地事务的提交操作。

    Confirm操作也需要保证幂等性。

  • Cancel阶段

    如果Try阶段有任何参与者返回失败,或者Confirm阶段有参与者失败,事务管理方向所有参与者发起Cancel请求,参与者执行本地事务的回滚操作。

    Cancel操作同样需要保证幂等性。

特点

  • TCC框架要求参与者使用数据库持久化记录事务数据,以便在事务失败后补偿重试。
  • TCC框架具有容灾能力,可以在网络异常或参与者故障时通过重试机制恢复事务。
  • TCC框架不仅可以认为是两阶段事务的实现(Try+Confirm为提交阶段,Cancel为回滚阶段),在Try之前加上资源检查的步骤也可以认为是三阶段事务的实现。

优化空间

  • 在需要极致响应的情况下,Try阶段结束后可以立刻返回,将Confirm或Cancel阶段交给线程池或其他异步方式执行。
  • 通过事务恢复机制(如定时任务、重试间隔、最大重试次数等)来确保事务的最终一致性。

综上所述,两阶段提交、三阶段提交和TCC框架都是用于解决分布式事务一致性问题的方法,它们各有优缺点,在实际应用中需要根据具体场景和需求选择合适的方法。